297 lines
12 KiB
Plaintext
297 lines
12 KiB
Plaintext
|
[1]Advent of Code
|
|||
|
|
|||
|
• [2][About]
|
|||
|
• [3][Events]
|
|||
|
• [4][Shop]
|
|||
|
• [5][Settings]
|
|||
|
• [6][Log Out]
|
|||
|
|
|||
|
br0xen [7](AoC++) 30*
|
|||
|
|
|||
|
0.0.0.0:[8]2023
|
|||
|
|
|||
|
• [9][Calendar]
|
|||
|
• [10][AoC++]
|
|||
|
• [11][Sponsors]
|
|||
|
• [12][Leaderboard]
|
|||
|
• [13][Stats]
|
|||
|
|
|||
|
Our [14]sponsors help make Advent of Code possible:
|
|||
|
[15]Honeycomb - On call for the holidays? Honeycomb adopters are happier
|
|||
|
and less burned out because we make your complex systems easy to
|
|||
|
understand.
|
|||
|
|
|||
|
--- Day 15: Lens Library ---
|
|||
|
|
|||
|
The newly-focused parabolic reflector dish is sending all of the collected
|
|||
|
light to a point on the side of yet another mountain - the largest
|
|||
|
mountain on Lava Island. As you approach the mountain, you find that the
|
|||
|
light is being collected by the wall of a large facility embedded in the
|
|||
|
mountainside.
|
|||
|
|
|||
|
You find a door under a large sign that says "Lava Production Facility"
|
|||
|
and next to a smaller sign that says "Danger - Personal Protective
|
|||
|
Equipment required beyond this point".
|
|||
|
|
|||
|
As you step inside, you are immediately greeted by a somewhat panicked
|
|||
|
reindeer wearing goggles and a loose-fitting [16]hard hat. The reindeer
|
|||
|
leads you to a shelf of goggles and hard hats (you quickly find some that
|
|||
|
fit) and then further into the facility. At one point, you pass a button
|
|||
|
with a faint snout mark and the label "PUSH FOR HELP". No wonder you were
|
|||
|
loaded into that [17]trebuchet so quickly!
|
|||
|
|
|||
|
You pass through a final set of doors surrounded with even more warning
|
|||
|
signs and into what must be the room that collects all of the light from
|
|||
|
outside. As you admire the large assortment of lenses available to further
|
|||
|
focus the light, the reindeer brings you a book titled "Initialization
|
|||
|
Manual".
|
|||
|
|
|||
|
"Hello!", the book cheerfully begins, apparently unaware of the concerned
|
|||
|
reindeer reading over your shoulder. "This procedure will let you bring
|
|||
|
the Lava Production Facility online - all without burning or melting
|
|||
|
anything unintended!"
|
|||
|
|
|||
|
"Before you begin, please be prepared to use the Holiday ASCII String
|
|||
|
Helper algorithm (appendix 1A)." You turn to appendix 1A. The reindeer
|
|||
|
leans closer with interest.
|
|||
|
|
|||
|
The HASH algorithm is a way to turn any [18]string of characters into a
|
|||
|
single number in the range 0 to 255. To run the HASH algorithm on a
|
|||
|
string, start with a current value of 0. Then, for each character in the
|
|||
|
string starting from the beginning:
|
|||
|
|
|||
|
• Determine the [19]ASCII code for the current character of the string.
|
|||
|
• Increase the current value by the ASCII code you just determined.
|
|||
|
• Set the current value to itself multiplied by 17.
|
|||
|
• Set the current value to the [20]remainder of dividing itself by 256.
|
|||
|
|
|||
|
After following these steps for each character in the string in order, the
|
|||
|
current value is the output of the HASH algorithm.
|
|||
|
|
|||
|
So, to find the result of running the HASH algorithm on the string HASH:
|
|||
|
|
|||
|
• The current value starts at 0.
|
|||
|
• The first character is H; its ASCII code is 72.
|
|||
|
• The current value increases to 72.
|
|||
|
• The current value is multiplied by 17 to become 1224.
|
|||
|
• The current value becomes 200 (the remainder of 1224 divided by 256).
|
|||
|
• The next character is A; its ASCII code is 65.
|
|||
|
• The current value increases to 265.
|
|||
|
• The current value is multiplied by 17 to become 4505.
|
|||
|
• The current value becomes 153 (the remainder of 4505 divided by 256).
|
|||
|
• The next character is S; its ASCII code is 83.
|
|||
|
• The current value increases to 236.
|
|||
|
• The current value is multiplied by 17 to become 4012.
|
|||
|
• The current value becomes 172 (the remainder of 4012 divided by 256).
|
|||
|
• The next character is H; its ASCII code is 72.
|
|||
|
• The current value increases to 244.
|
|||
|
• The current value is multiplied by 17 to become 4148.
|
|||
|
• The current value becomes 52 (the remainder of 4148 divided by 256).
|
|||
|
|
|||
|
So, the result of running the HASH algorithm on the string HASH is 52.
|
|||
|
|
|||
|
The initialization sequence (your puzzle input) is a comma-separated list
|
|||
|
of steps to start the Lava Production Facility. Ignore newline characters
|
|||
|
when parsing the initialization sequence. To verify that your HASH
|
|||
|
algorithm is working, the book offers the sum of the result of running the
|
|||
|
HASH algorithm on each step in the initialization sequence.
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
|
|||
|
|
|||
|
This initialization sequence specifies 11 individual steps; the result of
|
|||
|
running the HASH algorithm on each of the steps is as follows:
|
|||
|
|
|||
|
• rn=1 becomes 30.
|
|||
|
• cm- becomes 253.
|
|||
|
• qp=3 becomes 97.
|
|||
|
• cm=2 becomes 47.
|
|||
|
• qp- becomes 14.
|
|||
|
• pc=4 becomes 180.
|
|||
|
• ot=9 becomes 9.
|
|||
|
• ab=5 becomes 197.
|
|||
|
• pc- becomes 48.
|
|||
|
• pc=6 becomes 214.
|
|||
|
• ot=7 becomes 231.
|
|||
|
|
|||
|
In this example, the sum of these results is 1320. Unfortunately, the
|
|||
|
reindeer has stolen the page containing the expected verification number
|
|||
|
and is currently running around the facility with it excitedly.
|
|||
|
|
|||
|
Run the HASH algorithm on each step in the initialization sequence. What
|
|||
|
is the sum of the results? (The initialization sequence is one long line;
|
|||
|
be careful when copy-pasting it.)
|
|||
|
|
|||
|
Your puzzle answer was 515495.
|
|||
|
|
|||
|
--- Part Two ---
|
|||
|
|
|||
|
You convince the reindeer to bring you the page; the page confirms that
|
|||
|
your HASH algorithm is working.
|
|||
|
|
|||
|
The book goes on to describe a series of 256 boxes numbered 0 through 255.
|
|||
|
The boxes are arranged in a line starting from the point where light
|
|||
|
enters the facility. The boxes have holes that allow light to pass from
|
|||
|
one box to the next all the way down the line.
|
|||
|
|
|||
|
+-----+ +-----+ +-----+
|
|||
|
Light | Box | | Box | ... | Box |
|
|||
|
----------------------------------------->
|
|||
|
| 0 | | 1 | ... | 255 |
|
|||
|
+-----+ +-----+ +-----+
|
|||
|
|
|||
|
Inside each box, there are several lens slots that will keep a lens
|
|||
|
correctly positioned to focus light passing through the box. The side of
|
|||
|
each box has a panel that opens to allow you to insert or remove lenses as
|
|||
|
necessary.
|
|||
|
|
|||
|
Along the wall running parallel to the boxes is a large library containing
|
|||
|
lenses organized by focal length ranging from 1 through 9. The reindeer
|
|||
|
also brings you a small handheld [21]label printer.
|
|||
|
|
|||
|
The book goes on to explain how to perform each step in the initialization
|
|||
|
sequence, a process it calls the Holiday ASCII String Helper Manual
|
|||
|
Arrangement Procedure, or HASHMAP for short.
|
|||
|
|
|||
|
Each step begins with a sequence of letters that indicate the label of the
|
|||
|
lens on which the step operates. The result of running the HASH algorithm
|
|||
|
on the label indicates the correct box for that step.
|
|||
|
|
|||
|
The label will be immediately followed by a character that indicates the
|
|||
|
operation to perform: either an equals sign (=) or a dash (-).
|
|||
|
|
|||
|
If the operation character is a dash (-), go to the relevant box and
|
|||
|
remove the lens with the given label if it is present in the box. Then,
|
|||
|
move any remaining lenses as far forward in the box as they can go without
|
|||
|
changing their order, filling any space made by removing the indicated
|
|||
|
lens. (If no lens in that box has the given label, nothing happens.)
|
|||
|
|
|||
|
If the operation character is an equals sign (=), it will be followed by a
|
|||
|
number indicating the focal length of the lens that needs to go into the
|
|||
|
relevant box; be sure to use the label maker to mark the lens with the
|
|||
|
label given in the beginning of the step so you can find it later. There
|
|||
|
are two possible situations:
|
|||
|
|
|||
|
• If there is already a lens in the box with the same label, replace the
|
|||
|
old lens with the new lens: remove the old lens and put the new lens
|
|||
|
in its place, not moving any other lenses in the box.
|
|||
|
• If there is not already a lens in the box with the same label, add the
|
|||
|
lens to the box immediately behind any lenses already in the box.
|
|||
|
Don't move any of the other lenses when you do this. If there aren't
|
|||
|
any lenses in the box, the new lens goes all the way to the front of
|
|||
|
the box.
|
|||
|
|
|||
|
Here is the contents of every box after each step in the example
|
|||
|
initialization sequence above:
|
|||
|
|
|||
|
After "rn=1":
|
|||
|
Box 0: [rn 1]
|
|||
|
|
|||
|
After "cm-":
|
|||
|
Box 0: [rn 1]
|
|||
|
|
|||
|
After "qp=3":
|
|||
|
Box 0: [rn 1]
|
|||
|
Box 1: [qp 3]
|
|||
|
|
|||
|
After "cm=2":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 1: [qp 3]
|
|||
|
|
|||
|
After "qp-":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
|
|||
|
After "pc=4":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [pc 4]
|
|||
|
|
|||
|
After "ot=9":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [pc 4] [ot 9]
|
|||
|
|
|||
|
After "ab=5":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [pc 4] [ot 9] [ab 5]
|
|||
|
|
|||
|
After "pc-":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [ot 9] [ab 5]
|
|||
|
|
|||
|
After "pc=6":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [ot 9] [ab 5] [pc 6]
|
|||
|
|
|||
|
After "ot=7":
|
|||
|
Box 0: [rn 1] [cm 2]
|
|||
|
Box 3: [ot 7] [ab 5] [pc 6]
|
|||
|
|
|||
|
All 256 boxes are always present; only the boxes that contain any lenses
|
|||
|
are shown here. Within each box, lenses are listed from front to back;
|
|||
|
each lens is shown as its label and focal length in square brackets.
|
|||
|
|
|||
|
To confirm that all of the lenses are installed correctly, add up the
|
|||
|
focusing power of all of the lenses. The focusing power of a single lens
|
|||
|
is the result of multiplying together:
|
|||
|
|
|||
|
• One plus the box number of the lens in question.
|
|||
|
• The slot number of the lens within the box: 1 for the first lens, 2
|
|||
|
for the second lens, and so on.
|
|||
|
• The focal length of the lens.
|
|||
|
|
|||
|
At the end of the above example, the focusing power of each lens is as
|
|||
|
follows:
|
|||
|
|
|||
|
• rn: 1 (box 0) * 1 (first slot) * 1 (focal length) = 1
|
|||
|
• cm: 1 (box 0) * 2 (second slot) * 2 (focal length) = 4
|
|||
|
• ot: 4 (box 3) * 1 (first slot) * 7 (focal length) = 28
|
|||
|
• ab: 4 (box 3) * 2 (second slot) * 5 (focal length) = 40
|
|||
|
• pc: 4 (box 3) * 3 (third slot) * 6 (focal length) = 72
|
|||
|
|
|||
|
So, the above example ends up with a total focusing power of 145.
|
|||
|
|
|||
|
With the help of an over-enthusiastic reindeer in a hard hat, follow the
|
|||
|
initialization sequence. What is the focusing power of the resulting lens
|
|||
|
configuration?
|
|||
|
|
|||
|
Your puzzle answer was 229349.
|
|||
|
|
|||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
|||
|
|
|||
|
At this point, you should [22]return to your Advent calendar and try
|
|||
|
another puzzle.
|
|||
|
|
|||
|
If you still want to see it, you can [23]get your puzzle input.
|
|||
|
|
|||
|
You can also [Shareon [24]Twitter [25]Mastodon] this puzzle.
|
|||
|
|
|||
|
References
|
|||
|
|
|||
|
Visible links
|
|||
|
1. https://adventofcode.com/
|
|||
|
2. https://adventofcode.com/2023/about
|
|||
|
3. https://adventofcode.com/2023/events
|
|||
|
4. https://teespring.com/stores/advent-of-code
|
|||
|
5. https://adventofcode.com/2023/settings
|
|||
|
6. https://adventofcode.com/2023/auth/logout
|
|||
|
7. Advent of Code Supporter
|
|||
|
https://adventofcode.com/2023/support
|
|||
|
8. https://adventofcode.com/2023
|
|||
|
9. https://adventofcode.com/2023
|
|||
|
10. https://adventofcode.com/2023/support
|
|||
|
11. https://adventofcode.com/2023/sponsors
|
|||
|
12. https://adventofcode.com/2023/leaderboard
|
|||
|
13. https://adventofcode.com/2023/stats
|
|||
|
14. https://adventofcode.com/2023/sponsors
|
|||
|
15. https://www.honeycomb.io/product-overview
|
|||
|
16. https://en.wikipedia.org/wiki/Hard_hat
|
|||
|
17. https://adventofcode.com/2023/day/1
|
|||
|
18. https://en.wikipedia.org/wiki/String_(computer_science)
|
|||
|
19. https://en.wikipedia.org/wiki/ASCII#Printable_characters
|
|||
|
20. https://en.wikipedia.org/wiki/Modulo
|
|||
|
21. https://en.wikipedia.org/wiki/Label_printer
|
|||
|
22. https://adventofcode.com/2023
|
|||
|
23. https://adventofcode.com/2023/day/15/input
|
|||
|
24. https://twitter.com/intent/tweet?text=I%27ve+completed+%22Lens+Library%22+%2D+Day+15+%2D+Advent+of+Code+2023&url=https%3A%2F%2Fadventofcode%2Ecom%2F2023%2Fday%2F15&related=ericwastl&hashtags=AdventOfCode
|
|||
|
25. javascript:void(0);
|