Day 6 implementation in Java

main
MiguelMLorente 2023-12-08 11:58:56 +01:00
parent 217ec505f7
commit 58d61834ab
1 changed files with 49 additions and 0 deletions

View File

@ -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;
}
}