From 6405176f81b94a170eea99c689856a2fceecff10 Mon Sep 17 00:00:00 2001 From: Andreas Kocman Date: Tue, 26 Dec 2023 20:40:46 +0100 Subject: [PATCH] Day 09 part 2 --- ...nce.java => MirageMaintenancePartOne.java} | 6 +- .../aoc23/dec09/MirageMaintenancePartTwo.java | 61 +++++++++++++++++++ ...java => MirageMaintenancePartOneTest.java} | 14 ++--- .../dec09/MirageMaintenancePartTwoTest.java | 21 +++++++ 4 files changed, 92 insertions(+), 10 deletions(-) rename src/main/java/at/kocmana/aoc23/dec09/{MirageMaintenance.java => MirageMaintenancePartOne.java} (92%) create mode 100644 src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwo.java rename src/test/java/at/kocmana/aoc23/dec09/{MirageMaintenanceTest.java => MirageMaintenancePartOneTest.java} (73%) create mode 100644 src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwoTest.java diff --git a/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenance.java b/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOne.java similarity index 92% rename from src/main/java/at/kocmana/aoc23/dec09/MirageMaintenance.java rename to src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOne.java index f236eaf..6b99949 100644 --- a/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenance.java +++ b/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOne.java @@ -5,7 +5,7 @@ import java.util.ArrayList; import java.util.List; -public class MirageMaintenance { +public class MirageMaintenancePartOne { public static void main(String[] args) { var puzzleInput = ResourceToString.from("dec09", "MirageMaintenance.txt"); @@ -15,7 +15,7 @@ public static void main(String[] args) { static int play(String input) { return parseInput(input).stream() - .map(MirageMaintenance::inferNextInLine) + .map(MirageMaintenancePartOne::inferNextInLine) .reduce(0, (i, j) -> i + j); } @@ -39,7 +39,7 @@ static int inferNextInLine(List list) { static List> parseInput(String input) { return input.lines() - .map(MirageMaintenance::parseLine) + .map(MirageMaintenancePartOne::parseLine) .toList(); } diff --git a/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwo.java b/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwo.java new file mode 100644 index 0000000..55d6009 --- /dev/null +++ b/src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwo.java @@ -0,0 +1,61 @@ +package at.kocmana.aoc23.dec09; + +import at.kocmana.aoc23.common.Parser; +import at.kocmana.aoc23.common.ResourceToString; +import java.util.ArrayList; +import java.util.List; + +public class MirageMaintenancePartTwo { + + public static void main(String[] args) { + var puzzleInput = ResourceToString.from("dec09", "MirageMaintenance.txt"); + var result = play(puzzleInput); + System.out.printf("Result: %d%n", result); + } + + static int play(String input) { + return parseInput(input).stream() + .map(MirageMaintenancePartTwo::inferPreviousInLine) + .reduce(0, (i, j) -> i + j); + } + + static int inferPreviousInLine(List list) { + var currentList = list; + var reductions = new ArrayList>(); + //reduce downward + while (canBeFurtherReduced(currentList)) { + var reducedList = reduce(currentList); + reductions.add(reducedList); + currentList = reducedList; + } + //infer upward + for (int i = 0; i < reductions.size() - 1; i++) { + var last = reductions.get(reductions.size() - i - 1); + var secondToLast = reductions.get(reductions.size() - i - 2); + secondToLast.addFirst(secondToLast.getFirst() - last.getFirst()); + } + return list.getFirst() - reductions.getFirst().getFirst(); + } + + static List> parseInput(String input) { + return input.lines() + .map(MirageMaintenancePartTwo::parseLine) + .toList(); + } + + static List parseLine(String input) { + return Parser.toNumberList(input); + } + + static List reduce(List list) { + List reducedList = new ArrayList<>(list.size() - 1); + for (int i = 0; i < list.size() - 1; i++) { + reducedList.add(list.get(i + 1) - list.get(i)); + } + return reducedList; + } + + static boolean canBeFurtherReduced(List list) { + return !list.stream().allMatch(i -> i.equals(0)); + } +} diff --git a/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenanceTest.java b/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOneTest.java similarity index 73% rename from src/test/java/at/kocmana/aoc23/dec09/MirageMaintenanceTest.java rename to src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOneTest.java index 269b089..a4c3e9a 100644 --- a/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenanceTest.java +++ b/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartOneTest.java @@ -5,7 +5,7 @@ import java.util.List; import org.junit.jupiter.api.Test; -class MirageMaintenanceTest { +class MirageMaintenancePartOneTest { @Test void canParseLine() { @@ -13,7 +13,7 @@ void canParseLine() { var input = "0 3 6 9 12 15"; //when - var actualResult = MirageMaintenance.parseLine(input); + var actualResult = MirageMaintenancePartOne.parseLine(input); //then assertThat(actualResult).hasSize(6) @@ -26,7 +26,7 @@ void canReduce() { var valuesToReduce = List.of(0, 3, 6, 9, 12, 15); //when - var actualResult = MirageMaintenance.reduce(valuesToReduce); + var actualResult = MirageMaintenancePartOne.reduce(valuesToReduce); //then assertThat(actualResult).hasSize(valuesToReduce.size() - 1) @@ -39,7 +39,7 @@ void canAssessIfFurtherReductionIsPossiblePositive() { var valuesToAssess = List.of(3, 6, 9, 12); //when - var actualResult = MirageMaintenance.canBeFurtherReduced(valuesToAssess); + var actualResult = MirageMaintenancePartOne.canBeFurtherReduced(valuesToAssess); //then assertThat(actualResult).isTrue(); @@ -51,7 +51,7 @@ void canAssessIfFurtherReductionIsPossibleNegative() { var valuesToAssess = List.of(0, 0, 0, 0); //when - var actualResult = MirageMaintenance.canBeFurtherReduced(valuesToAssess); + var actualResult = MirageMaintenancePartOne.canBeFurtherReduced(valuesToAssess); //then assertThat(actualResult).isFalse(); @@ -63,7 +63,7 @@ void canInferNextInLine() { var lineToInferValueFrom = List.of(10, 13, 16, 21, 30, 45); //when - var actualResult = MirageMaintenance.inferNextInLine(lineToInferValueFrom); + var actualResult = MirageMaintenancePartOne.inferNextInLine(lineToInferValueFrom); //then assertThat(actualResult).isEqualTo(68); @@ -79,7 +79,7 @@ void canIntegrate() { """; //when - var actualResult = MirageMaintenance.play(testInput); + var actualResult = MirageMaintenancePartOne.play(testInput); //then assertThat(actualResult).isEqualTo(114); diff --git a/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwoTest.java b/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwoTest.java new file mode 100644 index 0000000..067d2a5 --- /dev/null +++ b/src/test/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwoTest.java @@ -0,0 +1,21 @@ +package at.kocmana.aoc23.dec09; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class MirageMaintenancePartTwoTest { + + @Test + void canInferPreviousInLine() { + //given + var input = List.of(10, 13, 16, 21, 30, 45); + + //when + var actualResult = MirageMaintenancePartTwo.inferPreviousInLine(input); + + //then + assertThat(actualResult).isEqualTo(5); + } +} \ No newline at end of file