b1rc challenge by @jeevjyot (#551)

* b1rc challenge

* fixed a rounding error

* added the file back

* fixed file

* removed a file

---------

Co-authored-by: Jeevjyot Singh Chhabda <jeevjyotsinghchhabda@Jeevjyots-MBP.hsd1.ca.comcast.net>
This commit is contained in:
Jeevjyot Singh Chhabda 2024-01-23 09:43:58 -08:00 committed by GitHub
parent 2c432abb96
commit 415b3eb5c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 126 additions and 0 deletions

19
calculate_average_jeevjyot.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
#
# Copyright 2023 The original authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
JAVA_OPTS=""
java $JAVA_OPTS --class-path target/average-1.0.0-SNAPSHOT.jar dev.morling.onebrc.CalculateAverage_jeevjyot

View File

@ -0,0 +1,107 @@
/*
* Copyright 2023 The original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dev.morling.onebrc;
import static java.lang.Math.round;
import static java.util.stream.Collectors.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collector;
public class CalculateAverage_jeevjyot {
public static final String MEAUREMENT_FILE = "./measurements.txt";
public static void main(String[] args) throws IOException {
Map<String, tempMeasurement> result = new ConcurrentHashMap<>();
Files.lines(Path.of(MEAUREMENT_FILE))
.parallel()
.forEach(s -> {
var separatorIndex = s.indexOf(";");
var stationName = s.substring(0, separatorIndex);
var temp = s.substring(separatorIndex + 1);
result.computeIfAbsent(stationName, d -> new tempMeasurement(parseDoubleFast(temp)))
.recordTemp(parseDoubleFast(temp));
});
TreeMap<String, tempMeasurement> sortedStats = new TreeMap<>(result);
System.out.println(sortedStats);
}
public static double parseDoubleFast(String str) {
// Simple implementation - can be improved with more error checking and support for different formats
boolean negative = false;
double result = 0;
int length = str.length();
int i = 0;
if (str.charAt(0) == '-') {
negative = true;
i++;
}
for (; i < length; i++) {
char c = str.charAt(i);
if (c == '.') {
int divisor = 1;
for (i++; i < length; i++) {
result += (double) (str.charAt(i) - '0') / (divisor *= 10);
}
break;
}
result = result * 10 + (c - '0');
}
return negative ? -result : result;
}
private static double round(double value) {
return Math.round(value * 10.0) / 10.0;
}
public static class tempMeasurement {
double minTemp;
double maxTemp;
double sum;
int count;
public tempMeasurement(double temString) {
this.minTemp = temString;
this.maxTemp = temString;
this.sum = 0.0;
this.count = 0;
}
public synchronized void recordTemp(Double temp) {
this.minTemp = Math.min(minTemp, temp);
this.maxTemp = Math.max(maxTemp, temp);
sum += temp;
count++;
}
double getAverage() {
return round(sum) / count;
}
@Override
public String toString() {
return String.format("%.1f/%.1f/%.1f", round(minTemp), round(getAverage()), round(maxTemp));
}
}
}