2023 Day 15 Complete!
This commit is contained in:
parent
0c611fdc3b
commit
5769c7e75c
1
2023/day15/input
Normal file
1
2023/day15/input
Normal file
File diff suppressed because one or more lines are too long
128
2023/day15/main.go
Normal file
128
2023/day15/main.go
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := h.StdinToString()
|
||||||
|
part1(inp)
|
||||||
|
fmt.Println()
|
||||||
|
part2(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(input string) {
|
||||||
|
var res int
|
||||||
|
pts := strings.Split(input, ",")
|
||||||
|
for i := range pts {
|
||||||
|
res += hash(pts[i])
|
||||||
|
}
|
||||||
|
fmt.Println("# Part 1")
|
||||||
|
fmt.Println(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(input string) {
|
||||||
|
var boxes []*Box
|
||||||
|
for i := 1; i <= 256; i++ {
|
||||||
|
boxes = append(boxes, &Box{num: i})
|
||||||
|
}
|
||||||
|
for _, v := range strings.Split(input, ",") {
|
||||||
|
l := NewLens(v)
|
||||||
|
if l.focalLength == -1 {
|
||||||
|
// Remove
|
||||||
|
boxes[l.box].Remove(l)
|
||||||
|
} else {
|
||||||
|
// Add/Replace
|
||||||
|
boxes[l.box].Add(l)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var res int
|
||||||
|
for i := range boxes {
|
||||||
|
res += boxes[i].FocusingPower()
|
||||||
|
}
|
||||||
|
fmt.Println("# Part 2")
|
||||||
|
fmt.Println(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Box struct {
|
||||||
|
num int
|
||||||
|
lenses []*Lens
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Box) Add(l *Lens) {
|
||||||
|
for i := range b.lenses {
|
||||||
|
if b.lenses[i].label == l.label {
|
||||||
|
b.lenses[i] = l
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.lenses = append(b.lenses, l)
|
||||||
|
}
|
||||||
|
func (b *Box) Remove(l *Lens) {
|
||||||
|
for i := range b.lenses {
|
||||||
|
if b.lenses[i].label == l.label {
|
||||||
|
b.lenses = append(b.lenses[:i], b.lenses[i+1:]...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (b *Box) FocusingPower() int {
|
||||||
|
var res int
|
||||||
|
for i := range b.lenses {
|
||||||
|
var lensRes int
|
||||||
|
lensRes = b.num
|
||||||
|
lensRes *= i + 1
|
||||||
|
lensRes *= b.lenses[i].focalLength
|
||||||
|
res += lensRes
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
type Lens struct {
|
||||||
|
label string
|
||||||
|
focalLength int
|
||||||
|
box int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLens(inp string) *Lens {
|
||||||
|
if strings.Contains(inp, "=") {
|
||||||
|
pts := strings.Split(inp, "=")
|
||||||
|
return &Lens{
|
||||||
|
label: pts[0],
|
||||||
|
focalLength: h.Atoi(pts[1]),
|
||||||
|
box: hash(pts[0]),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lbl := strings.TrimSuffix(inp, "-")
|
||||||
|
return &Lens{
|
||||||
|
label: lbl,
|
||||||
|
focalLength: -1,
|
||||||
|
box: hash(lbl),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash(inp string) int {
|
||||||
|
var res int
|
||||||
|
for _, i := range inp {
|
||||||
|
res += int(i)
|
||||||
|
res *= 17
|
||||||
|
res = res % 256
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func focusingPower(lens string, boxNum int, boxes [][]string) int {
|
||||||
|
res := boxNum + 1
|
||||||
|
for i := 1; i <= len(boxes[boxNum]); i++ {
|
||||||
|
if boxes[boxNum][i-1] == lens {
|
||||||
|
res *= i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
296
2023/day15/problem
Normal file
296
2023/day15/problem
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
[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);
|
1
2023/day15/testinput
Normal file
1
2023/day15/testinput
Normal file
@ -0,0 +1 @@
|
|||||||
|
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7
|
Loading…
Reference in New Issue
Block a user