Day 6 implementation in Java
parent
217ec505f7
commit
58d61834ab
|
|
@ -0,0 +1,49 @@
|
||||||
|
package day6;
|
||||||
|
|
||||||
|
import io.vavr.collection.List;
|
||||||
|
import util.FileReader;
|
||||||
|
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
private static final boolean ARE_SPACES_IGNORED = true;
|
||||||
|
private static final String TIMES_LINE_PREFIX = "Time:";
|
||||||
|
private static final String DISTANCES_LINE_PREFIX = "Distance:";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String inputFilePath = System.getProperty("user.dir") + "\\java\\src\\main\\java\\day6\\input.txt";
|
||||||
|
FileReader reader = new FileReader(inputFilePath);
|
||||||
|
List<String> inputData = List.ofAll(reader.readContents());
|
||||||
|
|
||||||
|
if (ARE_SPACES_IGNORED) {
|
||||||
|
inputData = inputData.map(string -> string.replaceAll(" ", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Long> times = List.of(inputData.get(0)
|
||||||
|
.replace(TIMES_LINE_PREFIX, "")
|
||||||
|
.split(" "))
|
||||||
|
.filter(string -> !string.isEmpty())
|
||||||
|
.map(Long::parseLong);
|
||||||
|
List<Long> distances = List.of(inputData.get(1)
|
||||||
|
.replace(DISTANCES_LINE_PREFIX, "")
|
||||||
|
.split(" "))
|
||||||
|
.filter(string -> !string.isEmpty())
|
||||||
|
.map(Long::parseLong);
|
||||||
|
|
||||||
|
Long multipliedValues = times.zip(distances)
|
||||||
|
.map(timeAndDistance -> getValidHoldingTimesCount(timeAndDistance._1, timeAndDistance._2))
|
||||||
|
.foldLeft(1L, (accumulator, value) -> accumulator * value);
|
||||||
|
System.out.println(multipliedValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Solves the equation (raceTime - holdingTime) * holdingTime > recordDistance
|
||||||
|
*/
|
||||||
|
private static Long getValidHoldingTimesCount(Long raceTime, Long recordDistance) {
|
||||||
|
Double discriminant = Math.sqrt(raceTime * raceTime - 4 * recordDistance);
|
||||||
|
|
||||||
|
Long maximumHoldingTime = (long) Math.floor((raceTime + discriminant) / 2.);
|
||||||
|
Long minimumHoldingTime = (long) Math.ceil((raceTime - discriminant) / 2.);
|
||||||
|
|
||||||
|
return maximumHoldingTime - minimumHoldingTime + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue