Skip to content

Commit

Permalink
Merge pull request #1 from kocmana/feature/dec-06
Browse files Browse the repository at this point in the history
Day 6 WIP
  • Loading branch information
kocmana authored Dec 20, 2023
2 parents 19e2044 + db3be3e commit 37ff502
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/main/java/at/kocmana/aoc23/common/Parser.java
Original file line number Diff line number Diff line change
@@ -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<Integer> toNumberList(String input) {
return Arrays.stream(input.trim().split("\\s+"))
.filter(not(String::isBlank))
.map(Integer::parseInt)
.toList();
}

}
69 changes: 69 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec06/WaitForIt.java
Original file line number Diff line number Diff line change
@@ -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<Race> 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
) {
}
30 changes: 30 additions & 0 deletions src/test/java/at/kocmana/aoc23/dec06/WaitForItTest.java
Original file line number Diff line number Diff line change
@@ -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)
);
}

}

0 comments on commit 37ff502

Please sign in to comment.