annotate day6.txt @ 13:7826431dbc4f

Finish day 5 part 2 - seeds with ranges There must be a cleaner method, but this works for splitting ranges when there's a partial overlap. An interim version dropped ranges because we were iterating over an array while also deleting items from it.
author IBBoard <dev@ibboard.co.uk>
date Sat, 09 Dec 2023 19:53:22 +0000
parents 6e0615e54e71
children 1e16a25a9553
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 --- Day 6: Wait For It ---
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 For example:
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 Time: 7 15 30
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 Distance: 9 40 200
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 This document describes three races:
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 The first race lasts 7 milliseconds. The record distance in this race is 9 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 The second race lasts 15 milliseconds. The record distance in this race is 40 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 The third race lasts 30 milliseconds. The record distance in this race is 200 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 So, because the first race lasts 7 milliseconds, you only have a few options:
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 Hold the button for 3 milliseconds. After its remaining 4 milliseconds of travel time, the boat will have gone 12 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 Hold the button for 4 milliseconds. After its remaining 3 milliseconds of travel time, the boat will have gone 12 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 Hold the button for 5 milliseconds, causing the boat to travel a total of 10 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 Hold the button for 6 milliseconds, causing the boat to travel a total of 6 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 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 go of the button. Please make sure you let go of the button so the boat gets to move. 0 millimeters.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 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.
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43 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).
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44
9d89489bc939 Day 6 part 1 - calculate times above range
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 Determine the number of ways you could beat the record in each race. What do you get if you multiply these numbers together?
7
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
46
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
47 --- Part Two ---
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
48
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
49 As the race is about to start, you realize the piece of paper with race times and record distances you got earlier actually just has very bad kerning. There's really only one race - ignore the spaces between the numbers on each line.
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
50
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
51 So, the example from before:
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
52
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
53 Time: 7 15 30
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
54 Distance: 9 40 200
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
55
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
56 ...now instead means this:
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
57
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
58 Time: 71530
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
59 Distance: 940200
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
60
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
61 Now, you have to figure out how many ways there are to win this single race. In this example, the race lasts for 71530 milliseconds and the record distance you need to beat is 940200 millimeters. You could hold the button anywhere from 14 to 71516 milliseconds and beat the record, a total of 71503 ways!
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
62
6e0615e54e71 Restructure input parsing for day6b
IBBoard <dev@ibboard.co.uk>
parents: 6
diff changeset
63 How many ways can you beat the record in this one much longer race?