2023-12-06 06:41:39 +01:00
package aoc2023
import println
import readInput
2023-12-09 09:20:30 +01:00
import splitInts
2023-12-06 06:41:39 +01:00
/ *
-- - Day 6 : Wait For It -- -
The ferry quickly brings you across Island Island . After asking around , you discover that there is indeed normally a large pile of sand somewhere near here , but you don ' t see anything besides lots of water and the small island where the ferry has docked .
As you try to figure out what to do next , you notice a poster on a wall near the ferry dock . " Boat races! Open to the public! Grand prize is an all-expenses-paid trip to Desert Island! " That must be where the sand comes from ! Best of all , the boat races are starting in just a few minutes .
You manage to sign up as a competitor in the boat races just in time . The organizer explains that it ' s not really a traditional race - instead , you will get a fixed amount of time during which your boat has to travel as far as it can , and you win if your boat goes the farthest .
As part of signing up , you get a sheet of paper ( your puzzle input ) that lists the time allowed for each race and also the best distance ever recorded in that race . To guarantee you win the grand prize , you need to make sure you go farther in each race than the current record holder .
The organizer brings you over to the area where the boat races are held . The boats are much smaller than you expected - they ' re actually toy boats , each with a big button on top . Holding down the button charges the boat , and releasing the button allows the boat to move . Boats move faster if their button was held longer , but time spent holding the button counts against the total race time . You can only hold the button at the start of the race , and boats don ' t move until the button is released .
For example :
Time : 7 15 30
Distance : 9 40 200
This document describes three races :
The first race lasts 7 milliseconds . The record distance in this race is 9 millimeters .
The second race lasts 15 milliseconds . The record distance in this race is 40 millimeters .
The third race lasts 30 milliseconds . The record distance in this race is 200 millimeters .
Your toy boat has a starting speed of zero millimeters per millisecond . For each whole millisecond you spend at the beginning of the race holding down the button , the boat ' s speed increases by one millimeter per millisecond .
So , because the first race lasts 7 milliseconds , you only have a few options :
Don ' t hold the button at all ( that is , hold it for 0 milliseconds ) at the start of the race . The boat won ' t move ; it will have traveled 0 millimeters by the end of the race .
Hold the button for 1 millisecond at the start of the race . Then , the boat will travel at a speed of 1 millimeter per millisecond for 6 milliseconds , reaching a total distance traveled of 6 millimeters .
Hold the button for 2 milliseconds , giving the boat a speed of 2 millimeters per millisecond . It will then get 5 milliseconds to move , reaching a total distance of 10 millimeters .
Hold the button for 3 milliseconds . After its remaining 4 milliseconds of travel time , the boat will have gone 12 millimeters .
Hold the button for 4 milliseconds . After its remaining 3 milliseconds of travel time , the boat will have gone 12 millimeters .
Hold the button for 5 milliseconds , causing the boat to travel a total of 10 millimeters .
Hold the button for 6 milliseconds , causing the boat to travel a total of 6 millimeters .
Hold the button for 7 milliseconds . That ' s the entire duration of the race . You never let go of the button . The boat can ' t move until you let you of the button . Please make sure you let go of the button so the boat gets to move . 0 millimeters .
Since the current record for this race is 9 millimeters , there are actually 4 different ways you could win : you could hold the button for 2 , 3 , 4 , or 5 milliseconds at the start of the race .
In the second race , you could hold the button for at least 4 milliseconds and at most 11 milliseconds and beat the record , a total of 8 different ways to win .
In the third race , you could hold the button for at least 11 milliseconds and no more than 19 milliseconds and still beat the record , a total of 9 ways you could win .
To see how much margin of error you have , determine the number of ways you can beat the record in each race ; in this example , if you multiply these values together , you get 288 ( 4 * 8 * 9 ) .
Determine the number of ways you could beat the record in each race . What do you get if you multiply these numbers together ?
* /
fun main ( ) {
val inlineTestInput = """
Time : 7 15 30
Distance : 9 40 200
"""
// Next time, don't be stupid. This is not the right formula for the problem:
// distance = (bt * (bt+1))/2 + bt * (tt - 2 * bt)
// Spend 30 minutes figuring out why I don't win any race when the boat is actually accelerating!
fun part1 ( input : List < String > ) : Int {
2023-12-09 09:20:30 +01:00
val times = input [ 0 ] . split ( " : " ) [ 1 ] . splitInts ( )
val distances = input [ 1 ] . split ( " : " ) [ 1 ] . splitInts ( )
2023-12-06 06:41:39 +01:00
val result = times . withIndex ( ) . map { ( i , tt ) ->
IntRange ( 1 , tt - 1 ) . count {
it * ( tt - it ) > distances [ i ]
}
}
return result . reduce { acc , i -> acc * i }
}
fun part2 ( input : List < String > ) : Int {
val tt = input [ 0 ] . split ( " : " ) [ 1 ] . replace ( " " , " " ) . toLong ( )
val distance = input [ 1 ] . split ( " : " ) [ 1 ] . replace ( " " , " " ) . toLong ( )
val result = LongRange ( 1 , tt - 1 ) . count {
it * ( tt - it ) > distance
}
return result
}
// test if implementation meets criteria from the description, like:
val testInput = inlineTestInput . trim ( ) . reader ( ) . readLines ( )
//val testInput = readInput("aoc2023/Day06_test")
val testInputPart1Result = part1 ( testInput )
println ( " Part 1 Test: $testInputPart1Result " )
val testInputPart2Result = part2 ( testInput )
println ( " Part 2 Test: $testInputPart2Result " )
check ( testInputPart1Result == 288 )
check ( testInputPart2Result == 71503 )
val input = readInput ( " aoc2023/Day06 " )
part1 ( input ) . println ( )
part2 ( input ) . println ( )
}