Skip to content

Commit

Permalink
Day 09 part 2
Browse files Browse the repository at this point in the history
  • Loading branch information
kocmana committed Dec 26, 2023
1 parent 7f5b7f9 commit 6405176
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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);
}

Expand All @@ -39,7 +39,7 @@ static int inferNextInLine(List<Integer> list) {

static List<List<Integer>> parseInput(String input) {
return input.lines()
.map(MirageMaintenance::parseLine)
.map(MirageMaintenancePartOne::parseLine)
.toList();
}

Expand Down
61 changes: 61 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec09/MirageMaintenancePartTwo.java
Original file line number Diff line number Diff line change
@@ -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<Integer> list) {
var currentList = list;
var reductions = new ArrayList<List<Integer>>();
//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<List<Integer>> parseInput(String input) {
return input.lines()
.map(MirageMaintenancePartTwo::parseLine)
.toList();
}

static List<Integer> parseLine(String input) {
return Parser.toNumberList(input);
}

static List<Integer> reduce(List<Integer> list) {
List<Integer> 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<Integer> list) {
return !list.stream().allMatch(i -> i.equals(0));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
import java.util.List;
import org.junit.jupiter.api.Test;

class MirageMaintenanceTest {
class MirageMaintenancePartOneTest {

@Test
void canParseLine() {
//given
var input = "0 3 6 9 12 15";

//when
var actualResult = MirageMaintenance.parseLine(input);
var actualResult = MirageMaintenancePartOne.parseLine(input);

//then
assertThat(actualResult).hasSize(6)
Expand All @@ -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)
Expand All @@ -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();
Expand All @@ -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();
Expand All @@ -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);
Expand All @@ -79,7 +79,7 @@ void canIntegrate() {
""";

//when
var actualResult = MirageMaintenance.play(testInput);
var actualResult = MirageMaintenancePartOne.play(testInput);

//then
assertThat(actualResult).isEqualTo(114);
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit 6405176

Please sign in to comment.