-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2 from kocmana/feature/dec-06
Day 6 - Part 1 and 2
- Loading branch information
Showing
6 changed files
with
153 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
69 changes: 69 additions & 0 deletions
69
src/main/java/at/kocmana/aoc23/dec06/WaitForItPartTwo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
) { | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Time: 59 79 65 75 | ||
Distance: 597 1234 1032 1328 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Time: 59796575 | ||
Distance: 597123410321328 |
69 changes: 69 additions & 0 deletions
69
src/test/java/at/kocmana/aoc23/dec06/WaitForItPartOneTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
|
||
} |
This file was deleted.
Oops, something went wrong.