diff --git a/src/main/java/at/kocmana/aoc23/common/Parser.java b/src/main/java/at/kocmana/aoc23/common/Parser.java new file mode 100644 index 0000000..cb3fbc4 --- /dev/null +++ b/src/main/java/at/kocmana/aoc23/common/Parser.java @@ -0,0 +1,21 @@ +package at.kocmana.aoc23.common; + +import static java.util.function.Predicate.not; + +import java.util.Arrays; +import java.util.List; + +public class Parser { + + private Parser() { + + } + + public static List toNumberList(String input) { + return Arrays.stream(input.trim().split("\\s+")) + .filter(not(String::isBlank)) + .map(Integer::parseInt) + .toList(); + } + +} diff --git a/src/main/java/at/kocmana/aoc23/dec06/WaitForIt.java b/src/main/java/at/kocmana/aoc23/dec06/WaitForIt.java new file mode 100644 index 0000000..870364d --- /dev/null +++ b/src/main/java/at/kocmana/aoc23/dec06/WaitForIt.java @@ -0,0 +1,69 @@ +package at.kocmana.aoc23.dec06; + +import static at.kocmana.aoc23.common.Parser.toNumberList; + +import java.util.List; +import java.util.stream.IntStream; + +public class WaitForIt { + + public static void main(String[] args) { + + } + + static List parseRaces(String input) { + input = input.replace("Time:", "") + .replace("Distance:", "") + .trim(); + var lines = input.split("\\n"); + var times = toNumberList(lines[0]); + var distances = toNumberList(lines[1]); + + assert (times.size() == distances.size()); + + return IntStream.range(0, times.size()) + .mapToObj(i -> new Race(times.get(i), distances.get(i))) + .toList(); + } + + static long assessNumberOfPossibleWins(Race race) { + return IntStream.range(1, race.time()) + .mapToObj(i -> { + var distance = calculateDistance(i, race.time()); + return new RaceOutcome( + distance, + isWin(race.distanceToBeat(), distance) + ); + }) + .filter(RaceOutcome::isWin) + .count(); + } + + static int calculateDistance(int durationButtonPressed, int totalRaceDuration) { + var remainingTime = totalRaceDuration - durationButtonPressed; + var speed = durationButtonPressed; + return speed * remainingTime; + } + + static boolean isWin(int distanceToBeat, int distance) { + return distanceToBeat < distance; + } + + long generateNumberOfWays(String input) { + return parseRaces(input).stream() + .map(WaitForIt::assessNumberOfPossibleWins) + .reduce(1L, (i, j) -> i * j); + } +} + +record Race( + int time, + int distanceToBeat +) { +} + +record RaceOutcome( + int distance, + boolean isWin +) { +} \ No newline at end of file diff --git a/src/test/java/at/kocmana/aoc23/dec06/WaitForItTest.java b/src/test/java/at/kocmana/aoc23/dec06/WaitForItTest.java new file mode 100644 index 0000000..614e82e --- /dev/null +++ b/src/test/java/at/kocmana/aoc23/dec06/WaitForItTest.java @@ -0,0 +1,30 @@ +package at.kocmana.aoc23.dec06; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class WaitForItTest { + + @Test + void canParse() { + //given + var input = """ + Time: 7 15 30 + Distance: 9 40 200 + """; + + //when + var actualResult = WaitForIt.parseRaces(input); + + //then + assertThat(actualResult).isNotNull() + .hasSize(3) + .contains( + new Race(7, 9), + new Race(15, 40), + new Race(30, 200) + ); + } + +} \ No newline at end of file