Skip to content

Commit

Permalink
Merge pull request #2 from kocmana/feature/dec-06
Browse files Browse the repository at this point in the history
Day 6 - Part 1 and 2
  • Loading branch information
kocmana authored Dec 20, 2023
2 parents 37ff502 + 1783850 commit 49bd3a5
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,22 @@

import static at.kocmana.aoc23.common.Parser.toNumberList;

import at.kocmana.aoc23.common.ResourceToString;
import java.util.List;
import java.util.stream.IntStream;

public class WaitForIt {
public class WaitForItPartOne {

public static void main(String[] args) {
var puzzleInput = ResourceToString.from("dec06", "WaitForItPartOne.txt");
var result = generateNumberOfWays(puzzleInput);
System.out.printf("Result: %d", result);
}

static long generateNumberOfWays(String input) {
return parseRaces(input).stream()
.map(WaitForItPartOne::assessNumberOfPossibleWins)
.reduce(1L, (i, j) -> i * j);
}

static List<Race> parseRaces(String input) {
Expand All @@ -22,7 +31,7 @@ static List<Race> parseRaces(String input) {
assert (times.size() == distances.size());

return IntStream.range(0, times.size())
.mapToObj(i -> new Race(times.get(i), distances.get(i)))
.mapToObj(i -> new Race(times.get((int) i), distances.get((int) i)))
.toList();
}

Expand All @@ -48,12 +57,6 @@ static int calculateDistance(int durationButtonPressed, int totalRaceDuration) {
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(
Expand Down
69 changes: 69 additions & 0 deletions src/main/java/at/kocmana/aoc23/dec06/WaitForItPartTwo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package at.kocmana.aoc23.dec06;

import static java.util.function.Predicate.not;

import at.kocmana.aoc23.common.ResourceToString;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.LongStream;

public class WaitForItPartTwo {

public static void main(String[] args) {
var puzzleInput = ResourceToString.from("dec06", "WaitForItPartTwo.txt");
var result = generateNumberOfWays(puzzleInput);
System.out.printf("Result: %d", result);
}

static long generateNumberOfWays(String input) {
var race = parseRaces(input).get(0);
return WaitForItPartTwo.assessNumberOfPossibleWins(race);
}

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();
}

public static List<Long> toNumberList(String input) {
return Arrays.stream(input.trim().split("\\s+"))
.filter(not(String::isBlank))
.map(Long::parseLong)
.toList();
}

static long assessNumberOfPossibleWins(Race race) {
return LongStream.range(1, race.time())
.map(pressedMs -> calculateDistance(pressedMs, race.time()))
.filter(distance -> isWin(race.distanceToBeat(), distance))
.count();
}

static long calculateDistance(long durationButtonPressed, long totalRaceDuration) {
var remainingTime = totalRaceDuration - durationButtonPressed;
var speed = durationButtonPressed;
return speed * remainingTime;
}

static Boolean isWin(long distanceToBeat, long distance) {
return distanceToBeat < distance;
}

record Race(
long time,
long distanceToBeat
) {
}

}
2 changes: 2 additions & 0 deletions src/main/resources/dec06/WaitForItPartOne.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 59 79 65 75
Distance: 597 1234 1032 1328
2 changes: 2 additions & 0 deletions src/main/resources/dec06/WaitForItPartTwo.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Time: 59796575
Distance: 597123410321328
69 changes: 69 additions & 0 deletions src/test/java/at/kocmana/aoc23/dec06/WaitForItPartOneTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package at.kocmana.aoc23.dec06;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class WaitForItPartOneTest {

@Test
void canParse() {
//given
var input = """
Time: 7 15 30
Distance: 9 40 200
""";

//when
var actualResult = WaitForItPartOne.parseRaces(input);

//then
assertThat(actualResult).isNotNull()
.hasSize(3)
.contains(
new Race(7, 9),
new Race(15, 40),
new Race(30, 200)
);
}

@ParameterizedTest
@CsvSource({
"0,0",
"1,6",
"2,10",
"3,12",
"4,12",
"5,10",
"6,6",
"7,0"
})
void canCalculateDistance(int durationOfButton, int expectedDistance) {
//given
var durationOfRace = 7;

//when
var actualResult = WaitForItPartOne.calculateDistance(durationOfButton, durationOfRace);

//then
assertThat(actualResult).isEqualTo(expectedDistance);
}

@Test
void canGenerateNumberOfPossibleWins(){
//given
var input = """
Time: 7 15 30
Distance: 9 40 200
""";

//when
var actualResult = WaitForItPartOne.generateNumberOfWays(input);

//then
assertThat(actualResult).isEqualTo(288);
}

}
30 changes: 0 additions & 30 deletions src/test/java/at/kocmana/aoc23/dec06/WaitForItTest.java

This file was deleted.

0 comments on commit 49bd3a5

Please sign in to comment.