From 58d61834abf514010f5cd3f339cbc0723105ec61 Mon Sep 17 00:00:00 2001 From: MiguelMLorente Date: Fri, 8 Dec 2023 11:58:56 +0100 Subject: [PATCH] Day 6 implementation in Java --- java/src/main/java/day6/Main.java | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 java/src/main/java/day6/Main.java diff --git a/java/src/main/java/day6/Main.java b/java/src/main/java/day6/Main.java new file mode 100644 index 0000000..a1d567e --- /dev/null +++ b/java/src/main/java/day6/Main.java @@ -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 inputData = List.ofAll(reader.readContents()); + + if (ARE_SPACES_IGNORED) { + inputData = inputData.map(string -> string.replaceAll(" ", "")); + } + + List times = List.of(inputData.get(0) + .replace(TIMES_LINE_PREFIX, "") + .split(" ")) + .filter(string -> !string.isEmpty()) + .map(Long::parseLong); + List 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; + } +}