This commit is contained in:
Brian Buller 2024-12-18 08:12:54 -06:00
parent 2091f6c894
commit 130904c604
12 changed files with 2188 additions and 276 deletions

119
2024/day07/problem Normal file
View File

@ -0,0 +1,119 @@
Advent of Code
--- Day 7: Bridge Repair ---
The Historians take you to a familiar [16]rope bridge over a river in the
middle of a jungle. The Chief isn't on this side of the bridge, though;
maybe he's on the other side?
When you go to cross the bridge, you notice a group of engineers trying to
repair it. (Apparently, it breaks pretty frequently.) You won't be able to
cross until it's fixed.
You ask how long it'll take; the engineers tell you that it only needs
final calibrations, but some young elephants were playing nearby and stole
all the operators from their calibration equations! They could finish the
calibrations if only someone could determine which test values could
possibly be produced by placing any combination of operators into their
calibration equations (your puzzle input).
For example:
190: 10 19
3267: 81 40 27
83: 17 5
156: 15 6
7290: 6 8 6 15
161011: 16 10 13
192: 17 8 14
21037: 9 7 18 13
292: 11 6 16 20
Each line represents a single equation. The test value appears before the
colon on each line; it is your job to determine whether the remaining
numbers can be combined with operators to produce the test value.
Operators are always evaluated left-to-right, not according to precedence
rules. Furthermore, numbers in the equations cannot be rearranged.
Glancing into the jungle, you can see elephants holding two different
types of operators: add (+) and multiply (*).
Only three of the above equations can be made true by inserting operators:
 190: 10 19 has only one position that accepts an operator: between 10
and 19. Choosing + would give 29, but choosing * would give the test
value (10 * 19 = 190).
 3267: 81 40 27 has two positions for operators. Of the four possible
configurations of the operators, two cause the right side to match the
test value: 81 + 40 * 27 and 81 * 40 + 27 both equal 3267 (when
evaluated left-to-right)!
 292: 11 6 16 20 can be solved in exactly one way: 11 + 6 * 16 + 20.
The engineers just need the total calibration result, which is the sum of
the test values from just the equations that could possibly be true. In
the above example, the sum of the test values for the three equations
listed above is 3749.
Determine which equations could possibly be true. What is their total
calibration result?
Your puzzle answer was 5030892084481.
--- Part Two ---
The engineers seem concerned; the total calibration result you gave them
is nowhere close to being within safety tolerances. Just then, you spot
your mistake: some well-hidden elephants are holding a third type of
operator.
The [17]concatenation operator (||) combines the digits from its left and
right inputs into a single number. For example, 12 || 345 would become
12345. All operators are still evaluated left-to-right.
Now, apart from the three equations that could be made true using only
addition and multiplication, the above example has three more equations
that can be made true by inserting operators:
 156: 15 6 can be made true through a single concatenation: 15 || 6 =
156.
 7290: 6 8 6 15 can be made true using 6 * 8 || 6 * 15.
 192: 17 8 14 can be made true using 17 || 8 + 14.
Adding up all six test values (the three that could be made before using
only + and * plus the new three that can now be made by also using ||)
produces the new total calibration result of 11387.
Using your new knowledge of elephant hiding spots, determine which
equations could possibly be true. What is their total calibration result?
Your puzzle answer was 91377448644679.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [18]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [19]get your puzzle input.
You can also [Shareon [20]Bluesky [21]Twitter [22]Mastodon] this puzzle.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2022/day/9
17. https://en.wikipedia.org/wiki/Concatenation
18. https://adventofcode.com/2024
19. https://adventofcode.com/2024/day/7/input

186
2024/day08/problem Normal file
View File

@ -0,0 +1,186 @@
Advent of Code
--- Day 8: Resonant Collinearity ---
You find yourselves on the [16]roof of a top-secret Easter Bunny
installation.
While The Historians do their thing, you take a look at the familiar huge
antenna. Much to your surprise, it seems to have been reconfigured to emit
a signal that makes people 0.1% more likely to buy Easter Bunny brand
Imitation Mediocre Chocolate as a Christmas gift! Unthinkable!
Scanning across the city, you find that there are actually many such
antennas. Each antenna is tuned to a specific frequency indicated by a
single lowercase letter, uppercase letter, or digit. You create a map
(your puzzle input) of these antennas. For example:
............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
The signal only applies its nefarious effect at specific antinodes based
on the resonant frequencies of the antennas. In particular, an antinode
occurs at any point that is perfectly in line with two antennas of the
same frequency - but only when one of the antennas is twice as far away as
the other. This means that for any pair of antennas with the same
frequency, there are two antinodes, one on either side of them.
So, for these two antennas with frequency a, they create the two antinodes
marked with #:
..........
...#......
..........
....a.....
..........
.....a....
..........
......#...
..........
..........
Adding a third antenna with the same frequency creates several more
antinodes. It would ideally add four antinodes, but two are off the right
side of the map, so instead it adds only two:
..........
...#......
#.........
....a.....
........a.
.....a....
..#.......
......#...
..........
..........
Antennas with different frequencies don't create antinodes; A and a count
as different frequencies. However, antinodes can occur at locations that
contain antennas. In this diagram, the lone antenna with frequency capital
A creates no antinodes but has a lowercase-a-frequency antinode at its
location:
..........
...#......
#.........
....a.....
........a.
.....a....
..#.......
......A...
..........
..........
The first example has antennas with two different frequencies, so the
antinodes they create look like this, plus an antinode overlapping the
topmost A-frequency antenna:
......#....#
...#....0...
....#0....#.
..#....0....
....0....#..
.#....A.....
...#........
#......#....
........A...
.........A..
..........#.
..........#.
Because the topmost A-frequency antenna overlaps with a 0-frequency
antinode, there are 14 total unique locations that contain an antinode
within the bounds of the map.
Calculate the impact of the signal. How many unique locations within the
bounds of the map contain an antinode?
Your puzzle answer was 311.
--- Part Two ---
Watching over your shoulder as you work, one of The Historians asks if you
took the effects of resonant harmonics into your calculations.
Whoops!
After updating your model, it turns out that an antinode occurs at any
grid position exactly in line with at least two antennas of the same
frequency, regardless of distance. This means that some of the new
antinodes will occur at the position of each antenna (unless that antenna
is the only one of its frequency).
So, these three T-frequency antennas now create many antinodes:
T....#....
...T......
.T....#...
.........#
..#.......
..........
...#......
..........
....#.....
..........
In fact, the three T-frequency antennas are all exactly in line with two
antennas, so they are all also antinodes! This brings the total number of
antinodes in the above example to 9.
The original example now has 34 antinodes, including the antinodes that
appear on every antenna:
##....#....#
.#.#....0...
..#.#0....#.
..##...0....
....0....#..
.#...#A....#
...#..#.....
#....#.#....
..#.....A...
....#....A..
.#........#.
...#......##
Calculate the impact of the signal using this updated model. How many
unique locations within the bounds of the map contain an antinode?
Your puzzle answer was 1115.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [17]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [18]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2016/day/25
17. https://adventofcode.com/2024
18. https://adventofcode.com/2024/day/8/input

146
2024/day09/problem Normal file
View File

@ -0,0 +1,146 @@
Advent of Code
--- Day 9: Disk Fragmenter ---
Another push of the button leaves you in the familiar hallways of some
friendly [16]amphipods! Good thing you each somehow got your own personal
mini submarine. The Historians jet away in search of the Chief, mostly by
driving directly into walls.
While The Historians quickly figure out how to pilot these things, you
notice an amphipod in the corner struggling with his computer. He's trying
to make more contiguous free space by compacting all of the files, but his
program isn't working; you offer to help.
He shows you the disk map (your puzzle input) he's already generated. For
example:
2333133121414131402
The disk map uses a dense format to represent the layout of files and free
space on the disk. The digits alternate between indicating the length of a
file and the length of free space.
So, a disk map like 12345 would represent a one-block file, two blocks of
free space, a three-block file, four blocks of free space, and then a
five-block file. A disk map like 90909 would represent three nine-block
files in a row (with no free space between them).
Each file on disk also has an ID number based on the order of the files as
they appear before they are rearranged, starting with ID 0. So, the disk
map 12345 has three files: a one-block file with ID 0, a three-block file
with ID 1, and a five-block file with ID 2. Using one character for each
block where digits are the file ID and . is free space, the disk map 12345
represents these individual blocks:
0..111....22222
The first example above, 2333133121414131402, represents these individual
blocks:
00...111...2...333.44.5555.6666.777.888899
The amphipod would like to move file blocks one at a time from the end of
the disk to the leftmost free space block (until there are no gaps
remaining between file blocks). For the disk map 12345, the process looks
like this:
0..111....22222
02.111....2222.
022111....222..
0221112...22...
02211122..2....
022111222......
The first example requires a few more steps:
00...111...2...333.44.5555.6666.777.888899
009..111...2...333.44.5555.6666.777.88889.
0099.111...2...333.44.5555.6666.777.8888..
00998111...2...333.44.5555.6666.777.888...
009981118..2...333.44.5555.6666.777.88....
0099811188.2...333.44.5555.6666.777.8.....
009981118882...333.44.5555.6666.777.......
0099811188827..333.44.5555.6666.77........
00998111888277.333.44.5555.6666.7.........
009981118882777333.44.5555.6666...........
009981118882777333644.5555.666............
00998111888277733364465555.66.............
0099811188827773336446555566..............
The final step of this file-compacting process is to update the filesystem
checksum. To calculate the checksum, add up the result of multiplying each
of these blocks' position with the file ID number it contains. The
leftmost block is in position 0. If a block contains free space, skip it
instead.
Continuing the first example, the first few blocks' position multiplied by
its file ID number are 0 * 0 = 0, 1 * 0 = 0, 2 * 9 = 18, 3 * 9 = 27, 4 * 8
= 32, and so on. In this example, the checksum is the sum of these, 1928.
Compact the amphipod's hard drive using the process he requested. What is
the resulting filesystem checksum? (Be careful copy/pasting the input for
this puzzle; it is a single, very long line.)
Your puzzle answer was 6211348208140.
--- Part Two ---
Upon completion, two things immediately become clear. First, the disk
definitely has a lot more contiguous free space, just like the amphipod
hoped. Second, the computer is running much more slowly! Maybe introducing
all of that [17]file system fragmentation was a bad idea?
The eager amphipod already has a new plan: rather than move individual
blocks, he'd like to try compacting the files on his disk by moving whole
files instead.
This time, attempt to move whole files to the leftmost span of free space
blocks that could fit the file. Attempt to move each file exactly once in
order of decreasing file ID number starting with the file with the highest
file ID number. If there is no span of free space to the left of a file
that is large enough to fit the file, the file does not move.
The first example from above now proceeds differently:
00...111...2...333.44.5555.6666.777.888899
0099.111...2...333.44.5555.6666.777.8888..
0099.1117772...333.44.5555.6666.....8888..
0099.111777244.333....5555.6666.....8888..
00992111777.44.333....5555.6666.....8888..
The process of updating the filesystem checksum is the same; now, this
example's checksum would be 2858.
Start over, now compacting the amphipod's hard drive using this new method
instead. What is the resulting filesystem checksum?
Your puzzle answer was 6239783302560.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [18]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [19]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2021/day/23
17. https://en.wikipedia.org/wiki/File_system_fragmentation
18. https://adventofcode.com/2024
19. https://adventofcode.com/2024/day/9/input

198
2024/day10/problem Normal file
View File

@ -0,0 +1,198 @@
Advent of Code
--- Day 10: Hoof It ---
You all arrive at a [16]Lava Production Facility on a floating island in
the sky. As the others begin to search the massive industrial complex, you
feel a small nose boop your leg and look down to discover a reindeer
wearing a hard hat.
The reindeer is holding a book titled "Lava Island Hiking Guide". However,
when you open the book, you discover that most of it seems to have been
scorched by lava! As you're about to ask how you can help, the reindeer
brings you a blank [17]topographic map of the surrounding area (your
puzzle input) and looks up at you excitedly.
Perhaps you can help fill in the missing hiking trails?
The topographic map indicates the height at each position using a scale
from 0 (lowest) to 9 (highest). For example:
0123
1234
8765
9876
Based on un-scorched scraps of the book, you determine that a good hiking
trail is as long as possible and has an even, gradual, uphill slope. For
all practical purposes, this means that a hiking trail is any path that
starts at height 0, ends at height 9, and always increases by a height of
exactly 1 at each step. Hiking trails never include diagonal steps - only
up, down, left, or right (from the perspective of the map).
You look up from the map and notice that the reindeer has helpfully begun
to construct a small pile of pencils, markers, rulers, compasses,
stickers, and other equipment you might need to update the map with hiking
trails.
A trailhead is any position that starts one or more hiking trails - here,
these positions will always have height 0. Assembling more fragments of
pages, you establish that a trailhead's score is the number of 9-height
positions reachable from that trailhead via a hiking trail. In the above
example, the single trailhead in the top left corner has a score of 1
because it can reach a single 9 (the one in the bottom left).
This trailhead has a score of 2:
...0...
...1...
...2...
6543456
7.....7
8.....8
9.....9
(The positions marked . are impassable tiles to simplify these examples;
they do not appear on your actual topographic map.)
This trailhead has a score of 4 because every 9 is reachable via a hiking
trail except the one immediately to the left of the trailhead:
..90..9
...1.98
...2..7
6543456
765.987
876....
987....
This topographic map contains two trailheads; the trailhead at the top has
a score of 1, while the trailhead at the bottom has a score of 2:
10..9..
2...8..
3...7..
4567654
...8..3
...9..2
.....01
Here's a larger example:
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
This larger example has 9 trailheads. Considering the trailheads in
reading order, they have scores of 5, 6, 5, 3, 1, 3, 5, 3, and 5. Adding
these scores together, the sum of the scores of all trailheads is 36.
The reindeer gleefully carries over a protractor and adds it to the pile.
What is the sum of the scores of all trailheads on your topographic map?
Your puzzle answer was 744.
--- Part Two ---
The reindeer spends a few minutes reviewing your hiking trail map before
realizing something, disappearing for a few minutes, and finally returning
with yet another slightly-charred piece of paper.
The paper describes a second way to measure a trailhead called its rating.
A trailhead's rating is the number of distinct hiking trails which begin
at that trailhead. For example:
.....0.
..4321.
..5..2.
..6543.
..7..4.
..8765.
..9....
The above map has a single trailhead; its rating is 3 because there are
exactly three distinct hiking trails which begin at that position:
.....0. .....0. .....0.
..4321. .....1. .....1.
..5.... .....2. .....2.
..6.... ..6543. .....3.
..7.... ..7.... .....4.
..8.... ..8.... ..8765.
..9.... ..9.... ..9....
Here is a map containing a single trailhead with rating 13:
..90..9
...1.98
...2..7
6543456
765.987
876....
987....
This map contains a single trailhead with rating 227 (because there are
121 distinct hiking trails that lead to the 9 on the right edge and 106
that lead to the 9 on the bottom edge):
012345
123456
234567
345678
4.6789
56789.
Here's the larger example from before:
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732
Considering its trailheads in reading order, they have ratings of 20, 24,
10, 4, 1, 4, 5, 8, and 5. The sum of all trailhead ratings in this larger
example topographic map is 81.
You're not sure how, but the reindeer seems to have crafted some tiny
flags out of toothpicks and bits of paper and is using them to mark
trailheads on your topographic map. What is the sum of the ratings of all
trailheads?
Your puzzle answer was 1651.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [18]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [19]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2023/day/15
17. https://en.wikipedia.org/wiki/Topographic_map
18. https://adventofcode.com/2024
19. https://adventofcode.com/2024/day/10/input

117
2024/day11/problem Normal file
View File

@ -0,0 +1,117 @@
Advent of Code
--- Day 11: Plutonian Pebbles ---
The ancient civilization on [16]Pluto was known for its ability to
manipulate spacetime, and while The Historians explore their infinite
corridors, you've noticed a strange set of physics-defying stones.
At first glance, they seem like normal stones: they're arranged in a
perfectly straight line, and each stone has a number engraved on it.
The strange part is that every time you blink, the stones change.
Sometimes, the number engraved on a stone changes. Other times, a stone
might split in two, causing all the other stones to shift over a bit to
make room in their perfectly straight line.
As you observe them for a while, you find that the stones have a
consistent behavior. Every time you blink, the stones each simultaneously
change according to the first applicable rule in this list:
 If the stone is engraved with the number 0, it is replaced by a stone
engraved with the number 1.
 If the stone is engraved with a number that has an even number of
digits, it is replaced by two stones. The left half of the digits are
engraved on the new left stone, and the right half of the digits are
engraved on the new right stone. (The new numbers don't keep extra
leading zeroes: 1000 would become stones 10 and 0.)
 If none of the other rules apply, the stone is replaced by a new
stone; the old stone's number multiplied by 2024 is engraved on the
new stone.
No matter how the stones change, their order is preserved, and they stay
on their perfectly straight line.
How will the stones evolve if you keep blinking at them? You take a note
of the number engraved on each stone in the line (your puzzle input).
If you have an arrangement of five stones engraved with the numbers 0 1 10
99 999 and you blink once, the stones transform as follows:
 The first stone, 0, becomes a stone marked 1.
 The second stone, 1, is multiplied by 2024 to become 2024.
 The third stone, 10, is split into a stone marked 1 followed by a
stone marked 0.
 The fourth stone, 99, is split into two stones marked 9.
 The fifth stone, 999, is replaced by a stone marked 2021976.
So, after blinking once, your five stones would become an arrangement of
seven stones engraved with the numbers 1 2024 1 0 9 9 2021976.
Here is a longer example:
Initial arrangement:
125 17
After 1 blink:
253000 1 7
After 2 blinks:
253 0 2024 14168
After 3 blinks:
512072 1 20 24 28676032
After 4 blinks:
512 72 2024 2 0 2 4 2867 6032
After 5 blinks:
1036288 7 2 20 24 4048 1 4048 8096 28 67 60 32
After 6 blinks:
2097446912 14168 4048 2 0 2 4 40 48 2024 40 48 80 96 2 8 6 7 6 0 3 2
In this example, after blinking six times, you would have 22 stones. After
blinking 25 times, you would have 55312 stones!
Consider the arrangement of stones in front of you. How many stones will
you have after blinking 25 times?
Your puzzle answer was 231278.
--- Part Two ---
The Historians sure are taking a long time. To be fair, the infinite
corridors are very large.
How many stones would you have after blinking a total of 75 times?
Your puzzle answer was 274229228071551.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [17]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [18]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2019/day/20
17. https://adventofcode.com/2024
18. https://adventofcode.com/2024/day/11/input

228
2024/day12/problem Normal file
View File

@ -0,0 +1,228 @@
Advent of Code
--- Day 12: Garden Groups ---
Why not search for the Chief Historian near the [16]gardener and his
[17]massive farm? There's plenty of food, so The Historians grab something
to eat while they search.
You're about to settle near a complex arrangement of garden plots when
some Elves ask if you can lend a hand. They'd like to set up fences around
each region of garden plots, but they can't figure out how much fence they
need to order or how much it will cost. They hand you a map (your puzzle
input) of the garden plots.
Each garden plot grows only a single type of plant and is indicated by a
single letter on your map. When multiple garden plots are growing the same
type of plant and are touching (horizontally or vertically), they form a
region. For example:
AAAA
BBCD
BBCC
EEEC
This 4x4 arrangement includes garden plots growing five different types of
plants (labeled A, B, C, D, and E), each grouped into their own region.
In order to accurately calculate the cost of the fence around a single
region, you need to know that region's area and perimeter.
The area of a region is simply the number of garden plots the region
contains. The above map's type A, B, and C plants are each in a region of
area 4. The type E plants are in a region of area 3; the type D plants are
in a region of area 1.
Each garden plot is a square and so has four sides. The perimeter of a
region is the number of sides of garden plots in the region that do not
touch another garden plot in the same region. The type A and C plants are
each in a region with perimeter 10. The type B and E plants are each in a
region with perimeter 8. The lone D plot forms its own region with
perimeter 4.
Visually indicating the sides of plots in each region that contribute to
the perimeter using - and |, the above map's regions' perimeters are
measured as follows:
+-+-+-+-+
|A A A A|
+-+-+-+-+ +-+
|D|
+-+-+ +-+ +-+
|B B| |C|
+ + + +-+
|B B| |C C|
+-+-+ +-+ +
|C|
+-+-+-+ +-+
|E E E|
+-+-+-+
Plants of the same type can appear in multiple separate regions, and
regions can even appear within other regions. For example:
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO
The above map contains five regions, one containing all of the O garden
plots, and the other four each containing a single X plot.
The four X regions each have area 1 and perimeter 4. The region containing
21 type O plants is more complicated; in addition to its outer edge
contributing a perimeter of 20, its boundary with each X region
contributes an additional 4 to its perimeter, for a total perimeter of 36.
Due to "modern" business practices, the price of fence required for a
region is found by multiplying that region's area by its perimeter. The
total price of fencing all regions on a map is found by adding together
the price of fence for every region on the map.
In the first example, region A has price 4 * 10 = 40, region B has price 4
* 8 = 32, region C has price 4 * 10 = 40, region D has price 1 * 4 = 4,
and region E has price 3 * 8 = 24. So, the total price for the first
example is 140.
In the second example, the region with all of the O plants has price 21 *
36 = 756, and each of the four smaller X regions has price 1 * 4 = 4, for
a total price of 772 (756 + 4 + 4 + 4 + 4).
Here's a larger example:
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE
It contains:
 A region of R plants with price 12 * 18 = 216.
 A region of I plants with price 4 * 8 = 32.
 A region of C plants with price 14 * 28 = 392.
 A region of F plants with price 10 * 18 = 180.
 A region of V plants with price 13 * 20 = 260.
 A region of J plants with price 11 * 20 = 220.
 A region of C plants with price 1 * 4 = 4.
 A region of E plants with price 13 * 18 = 234.
 A region of I plants with price 14 * 22 = 308.
 A region of M plants with price 5 * 12 = 60.
 A region of S plants with price 3 * 8 = 24.
So, it has a total price of 1930.
What is the total price of fencing all regions on your map?
Your puzzle answer was 1522850.
--- Part Two ---
Fortunately, the Elves are trying to order so much fence that they qualify
for a bulk discount!
Under the bulk discount, instead of using the perimeter to calculate the
price, you need to use the number of sides each region has. Each straight
section of fence counts as a side, regardless of how long it is.
Consider this example again:
AAAA
BBCD
BBCC
EEEC
The region containing type A plants has 4 sides, as does each of the
regions containing plants of type B, D, and E. However, the more complex
region containing the plants of type C has 8 sides!
Using the new method of calculating the per-region price by multiplying
the region's area by its number of sides, regions A through E have prices
16, 16, 32, 4, and 12, respectively, for a total price of 80.
The second example above (full of type X and O plants) would have a total
price of 436.
Here's a map that includes an E-shaped region full of type E plants:
EEEEE
EXXXX
EEEEE
EXXXX
EEEEE
The E-shaped region has an area of 17 and 12 sides for a price of 204.
Including the two regions full of type X plants, this map has a total
price of 236.
This map has a total price of 368:
AAAAAA
AAABBA
AAABBA
ABBAAA
ABBAAA
AAAAAA
It includes two regions full of type B plants (each with 4 sides) and a
single region full of type A plants (with 4 sides on the outside and 8
more sides on the inside, a total of 12 sides). Be especially careful when
counting the fence around regions like the one full of type A plants; in
particular, each section of fence has an in-side and an out-side, so the
fence does not connect across the middle of the region (where the two B
regions touch diagonally). (The Elves would have used the Möbius Fencing
Company instead, but their contract terms were too one-sided.)
The larger example from before now has the following updated prices:
 A region of R plants with price 12 * 10 = 120.
 A region of I plants with price 4 * 4 = 16.
 A region of C plants with price 14 * 22 = 308.
 A region of F plants with price 10 * 12 = 120.
 A region of V plants with price 13 * 10 = 130.
 A region of J plants with price 11 * 12 = 132.
 A region of C plants with price 1 * 4 = 4.
 A region of E plants with price 13 * 8 = 104.
 A region of I plants with price 14 * 16 = 224.
 A region of M plants with price 5 * 6 = 30.
 A region of S plants with price 3 * 6 = 18.
Adding these together produces its new total price of 1206.
What is the new total price of fencing all regions on your map?
Your puzzle answer was 953738.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [18]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [19]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2023/day/5
17. https://adventofcode.com/2023/day/21
18. https://adventofcode.com/2024
19. https://adventofcode.com/2024/day/12/input

145
2024/day13/problem Normal file
View File

@ -0,0 +1,145 @@
Advent of Code
--- Day 13: Claw Contraption ---
Next up: the [16]lobby of a resort on a tropical island. The Historians
take a moment to admire the hexagonal floor tiles before spreading out.
Fortunately, it looks like the resort has a new [17]arcade! Maybe you can
win some prizes from the [18]claw machines?
The claw machines here are a little unusual. Instead of a joystick or
directional buttons to control the claw, these machines have two buttons
labeled A and B. Worse, you can't just put in a token and play; it costs 3
tokens to push the A button and 1 token to push the B button.
With a little experimentation, you figure out that each machine's buttons
are configured to move the claw a specific amount to the right (along the
X axis) and a specific amount forward (along the Y axis) each time that
button is pressed.
Each machine contains one prize; to win the prize, the claw must be
positioned exactly above the prize on both the X and Y axes.
You wonder: what is the smallest number of tokens you would have to spend
to win as many prizes as possible? You assemble a list of every machine's
button behavior and prize location (your puzzle input). For example:
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=8400, Y=5400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=12748, Y=12176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=7870, Y=6450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=18641, Y=10279
This list describes the button configuration and prize location of four
different claw machines.
For now, consider just the first claw machine in the list:
 Pushing the machine's A button would move the claw 94 units along the
X axis and 34 units along the Y axis.
 Pushing the B button would move the claw 22 units along the X axis and
67 units along the Y axis.
 The prize is located at X=8400, Y=5400; this means that from the
claw's initial position, it would need to move exactly 8400 units
along the X axis and exactly 5400 units along the Y axis to be
perfectly aligned with the prize in this machine.
The cheapest way to win the prize is by pushing the A button 80 times and
the B button 40 times. This would line up the claw along the X axis
(because 80*94 + 40*22 = 8400) and along the Y axis (because 80*34 + 40*67
= 5400). Doing this would cost 80*3 tokens for the A presses and 40*1 for
the B presses, a total of 280 tokens.
For the second and fourth claw machines, there is no combination of A and
B presses that will ever win a prize.
For the third claw machine, the cheapest way to win the prize is by
pushing the A button 38 times and the B button 86 times. Doing this would
cost a total of 200 tokens.
So, the most prizes you could possibly win is two; the minimum tokens you
would have to spend to win all (two) prizes is 480.
You estimate that each button would need to be pressed no more than 100
times to win a prize. How else would someone be expected to play?
Figure out how to win as many prizes as possible. What is the fewest
tokens you would have to spend to win all possible prizes?
Your puzzle answer was 30973.
--- Part Two ---
As you go to win the first prize, you discover that the claw is nowhere
near where you expected it would be. Due to a unit conversion error in
your measurements, the position of every prize is actually 10000000000000
higher on both the X and Y axis!
Add 10000000000000 to the X and Y position of every prize. After making
this change, the example above would now look like this:
Button A: X+94, Y+34
Button B: X+22, Y+67
Prize: X=10000000008400, Y=10000000005400
Button A: X+26, Y+66
Button B: X+67, Y+21
Prize: X=10000000012748, Y=10000000012176
Button A: X+17, Y+86
Button B: X+84, Y+37
Prize: X=10000000007870, Y=10000000006450
Button A: X+69, Y+23
Button B: X+27, Y+71
Prize: X=10000000018641, Y=10000000010279
Now, it is only possible to win a prize on the second and fourth claw
machines. Unfortunately, it will take many more than 100 presses to do so.
Using the corrected prize coordinates, figure out how to win as many
prizes as possible. What is the fewest tokens you would have to spend to
win all possible prizes?
Your puzzle answer was 95688837203288.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [19]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [20]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
11. https://adventofcode.com/2024/sponsors
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2020/day/24
17. https://en.wikipedia.org/wiki/Amusement_arcade
18. https://en.wikipedia.org/wiki/Claw_machine
19. https://adventofcode.com/2024
20. https://adventofcode.com/2024/day/13/input

193
2024/day14/problem Normal file
View File

@ -0,0 +1,193 @@
Advent of Code
--- Day 14: Restroom Redoubt ---
One of The Historians needs to use the bathroom; fortunately, you know
there's a bathroom near an unvisited location on their list, and so you're
all quickly teleported directly to the lobby of Easter Bunny Headquarters.
Unfortunately, EBHQ seems to have "improved" bathroom security again after
your last [16]visit. The area outside the bathroom is swarming with
robots!
To get The Historian safely to the bathroom, you'll need a way to predict
where the robots will be in the future. Fortunately, they all seem to be
moving on the tile floor in predictable straight lines.
You make a list (your puzzle input) of all of the robots' current
positions (p) and velocities (v), one robot per line. For example:
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3
Each robot's position is given as p=x,y where x represents the number of
tiles the robot is from the left wall and y represents the number of tiles
from the top wall (when viewed from above). So, a position of p=0,0 means
the robot is all the way in the top-left corner.
Each robot's velocity is given as v=x,y where x and y are given in tiles
per second. Positive x means the robot is moving to the right, and
positive y means the robot is moving down. So, a velocity of v=1,-2 means
that each second, the robot moves 1 tile to the right and 2 tiles up.
The robots outside the actual bathroom are in a space which is 101 tiles
wide and 103 tiles tall (when viewed from above). However, in this
example, the robots are in a space which is only 11 tiles wide and 7 tiles
tall.
The robots are good at navigating over/under each other (due to a
combination of springs, extendable legs, and quadcopters), so they can
share the same tile and don't interact with each other. Visually, the
number of robots on each tile in this example looks like this:
1.12.......
...........
...........
......11.11
1.1........
.........1.
.......1...
These robots have a unique feature for maximum bathroom security: they can
teleport. When a robot would run into an edge of the space they're in,
they instead teleport to the other side, effectively wrapping around the
edges. Here is what robot p=2,4 v=2,-3 does for the first few seconds:
Initial state:
...........
...........
...........
...........
..1........
...........
...........
After 1 second:
...........
....1......
...........
...........
...........
...........
...........
After 2 seconds:
...........
...........
...........
...........
...........
......1....
...........
After 3 seconds:
...........
...........
........1..
...........
...........
...........
...........
After 4 seconds:
...........
...........
...........
...........
...........
...........
..........1
After 5 seconds:
...........
...........
...........
.1.........
...........
...........
...........
The Historian can't wait much longer, so you don't have to simulate the
robots for very long. Where will the robots be after 100 seconds?
In the above example, the number of robots on each tile after 100 seconds
has elapsed looks like this:
......2..1.
...........
1..........
.11........
.....1.....
...12......
.1....1....
To determine the safest area, count the number of robots in each quadrant
after 100 seconds. Robots that are exactly in the middle (horizontally or
vertically) don't count as being in any quadrant, so the only relevant
robots are:
..... 2..1.
..... .....
1.... .....
..... .....
...12 .....
.1... 1....
In this example, the quadrants contain 1, 3, 4, and 1 robot. Multiplying
these together gives a total safety factor of 12.
Predict the motion of the robots in your list within a space which is 101
tiles wide and 103 tiles tall. What will the safety factor be after
exactly 100 seconds have elapsed?
Your puzzle answer was 218965032.
--- Part Two ---
During the bathroom break, someone notices that these robots seem awfully
similar to ones built and used at the North Pole. If they're the same type
of robots, they should have a hard-coded Easter egg: very rarely, most of
the robots should arrange themselves into a picture of a Christmas tree.
What is the fewest number of seconds that must elapse for the robots to
display the Easter egg?
Your puzzle answer was 7037.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [17]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [18]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2016/day/2
17. https://adventofcode.com/2024
18. https://adventofcode.com/2024/day/14/input

498
2024/day15/problem Normal file
View File

@ -0,0 +1,498 @@
Advent of Code
--- Day 15: Warehouse Woes ---
You appear back inside your own mini submarine! Each Historian drives
their mini submarine in a different direction; maybe the Chief has his own
submarine down here somewhere as well?
You look up to see a vast school of [16]lanternfish swimming past you. On
closer inspection, they seem quite anxious, so you drive your mini
submarine over to see if you can help.
Because lanternfish populations grow rapidly, they need a lot of food, and
that food needs to be stored somewhere. That's why these lanternfish have
built elaborate warehouse complexes operated by robots!
These lanternfish seem so anxious because they have lost control of the
robot that operates one of their most important warehouses! It is
currently running amok, pushing around boxes in the warehouse with no
regard for lanternfish logistics or lanternfish inventory management
strategies.
Right now, none of the lanternfish are brave enough to swim up to an
unpredictable robot so they could shut it off. However, if you could
anticipate the robot's movements, maybe they could find a safe option.
The lanternfish already have a map of the warehouse and a list of
movements the robot will attempt to make (your puzzle input). The problem
is that the movements will sometimes fail as boxes are shifted around,
making the actual movements of the robot difficult to predict.
For example:
##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
As the robot (@) attempts to move, if there are any boxes (O) in the way,
the robot will also attempt to push those boxes. However, if this action
would cause the robot or a box to move into a wall (#), nothing moves
instead, including the robot. The initial positions of these are shown on
the map at the top of the document the lanternfish gave you.
The rest of the document describes the moves (^ for up, v for down, < for
left, > for right) that the robot will attempt to make, in order. (The
moves form a single giant sequence; they are broken into multiple lines
just to make copy-pasting easier. Newlines within the move sequence should
be ignored.)
Here is a smaller example to get started:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<
Were the robot to attempt the given sequence of moves, it would push
around the boxes as follows:
Initial state:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move <:
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move ^:
########
#.@O.O.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move ^:
########
#.@O.O.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#..@OO.#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#...@OO#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move >:
########
#...@OO#
##..O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
Move v:
########
#....OO#
##..@..#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##..@..#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.@...#
#...O..#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##.....#
#..@O..#
#.#.O..#
#...O..#
#...O..#
########
Move >:
########
#....OO#
##.....#
#...@O.#
#.#.O..#
#...O..#
#...O..#
########
Move >:
########
#....OO#
##.....#
#....@O#
#.#.O..#
#...O..#
#...O..#
########
Move v:
########
#....OO#
##.....#
#.....O#
#.#.O@.#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.....#
#.....O#
#.#O@..#
#...O..#
#...O..#
########
Move <:
########
#....OO#
##.....#
#.....O#
#.#O@..#
#...O..#
#...O..#
########
The larger example has many more moves; after the robot has finished those
moves, the warehouse would look like this:
##########
#.O.O.OOO#
#........#
#OO......#
#OO@.....#
#O#.....O#
#O.....OO#
#O.....OO#
#OO....OO#
##########
The lanternfish use their own custom Goods Positioning System (GPS for
short) to track the locations of the boxes. The GPS coordinate of a box is
equal to 100 times its distance from the top edge of the map plus its
distance from the left edge of the map. (This process does not stop at
wall tiles; measure all the way to the edges of the map.)
So, the box shown below has a distance of 1 from the top edge of the map
and 4 from the left edge of the map, resulting in a GPS coordinate of 100
* 1 + 4 = 104.
#######
#...O..
#......
The lanternfish would like to know the sum of all boxes' GPS coordinates
after the robot finishes moving. In the larger example, the sum of all
boxes' GPS coordinates is 10092. In the smaller example, the sum is 2028.
Predict the motion of the robot and boxes in the warehouse. After the
robot is finished moving, what is the sum of all boxes' GPS coordinates?
Your puzzle answer was 1527563.
--- Part Two ---
The lanternfish use your information to find a safe moment to swim in and
turn off the malfunctioning robot! Just as they start preparing a festival
in your honor, reports start coming in that a second warehouse's robot is
also malfunctioning.
This warehouse's layout is surprisingly similar to the one you just
helped. There is one key difference: everything except the robot is twice
as wide! The robot's list of movements doesn't change.
To get the wider warehouse's map, start with your original map and, for
each tile, make the following changes:
 If the tile is #, the new map contains ## instead.
 If the tile is O, the new map contains [] instead.
 If the tile is ., the new map contains .. instead.
 If the tile is @, the new map contains @. instead.
This will produce a new warehouse map which is twice as wide and with wide
boxes that are represented by []. (The robot does not change size.)
The larger example from before would now look like this:
####################
##....[]....[]..[]##
##............[]..##
##..[][]....[]..[]##
##....[]@.....[]..##
##[]##....[]......##
##[]....[]....[]..##
##..[][]..[]..[][]##
##........[]......##
####################
Because boxes are now twice as wide but the robot is still the same size
and speed, boxes can be aligned such that they directly push two other
boxes at once. For example, consider this situation:
#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^
After appropriately resizing this map, the robot would push around these
boxes as follows:
Initial state:
##############
##......##..##
##..........##
##....[][]@.##
##....[]....##
##..........##
##############
Move <:
##############
##......##..##
##..........##
##...[][]@..##
##....[]....##
##..........##
##############
Move v:
##############
##......##..##
##..........##
##...[][]...##
##....[].@..##
##..........##
##############
Move v:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##.......@..##
##############
Move <:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##......@...##
##############
Move <:
##############
##......##..##
##..........##
##...[][]...##
##....[]....##
##.....@....##
##############
Move ^:
##############
##......##..##
##...[][]...##
##....[]....##
##.....@....##
##..........##
##############
Move ^:
##############
##......##..##
##...[][]...##
##....[]....##
##.....@....##
##..........##
##############
Move <:
##############
##......##..##
##...[][]...##
##....[]....##
##....@.....##
##..........##
##############
Move <:
##############
##......##..##
##...[][]...##
##....[]....##
##...@......##
##..........##
##############
Move ^:
##############
##......##..##
##...[][]...##
##...@[]....##
##..........##
##..........##
##############
Move ^:
##############
##...[].##..##
##...@.[]...##
##....[]....##
##..........##
##..........##
##############
This warehouse also uses GPS to locate the boxes. For these larger boxes,
distances are measured from the edge of the map to the closest edge of the
box in question. So, the box shown below has a distance of 1 from the top
edge of the map and 5 from the left edge of the map, resulting in a GPS
coordinate of 100 * 1 + 5 = 105.
##########
##...[]...
##........
In the scaled-up version of the larger example from above, after the robot
has finished all of its moves, the warehouse would look like this:
####################
##[].......[].[][]##
##[]...........[].##
##[]........[][][]##
##[]......[]....[]##
##..##......[]....##
##..[]............##
##..@......[].[][]##
##......[][]..[]..##
####################
The sum of these boxes' GPS coordinates is 9021.
Predict the motion of the robot and boxes in this new, scaled-up
warehouse. What is the sum of all boxes' final GPS coordinates?
Your puzzle answer was 1521635.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [17]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [18]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
11. https://adventofcode.com/2024/sponsors
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2021/day/6
17. https://adventofcode.com/2024
18. https://adventofcode.com/2024/day/15/input

View File

@ -1,276 +0,0 @@
package main
import (
"errors"
"fmt"
h "git.bullercodeworks.com/brian/adventofcode/helpers"
)
func main() {
inp := h.StdinToStringSlice()
part1(inp)
// fmt.Println()
// part2(inp)
}
var (
N = h.Coordinate{X: 0, Y: -1}
E = h.Coordinate{X: 1, Y: 0}
S = h.Coordinate{X: 0, Y: 1}
W = h.Coordinate{X: -1, Y: 0}
)
var (
scoreTrack map[h.Coordinate]int
bestCostToEnd map[h.Coordinate]int
)
func part1(inpS []string) {
inp := h.StringSliceToCoordByteMap(inpS)
scoreTrack = make(map[h.Coordinate]int)
bestCostToEnd = make(map[h.Coordinate]int)
start, _ := inp.FindFirst('S')
end, _ := inp.FindFirst('E')
inp.Put(start, '.')
bestCostToEnd[end] = 0
cd := CD{c: start, d: E}
solve(inp, cd, end, 0, []h.Coordinate{cd.c})
best, ok := scoreTrack[end]
if !ok {
panic(errors.New("no path to end found"))
}
fmt.Println("Best Score:", best)
bestSeats := make(map[h.Coordinate]byte)
for i := range bestPaths {
for j := range bestPaths[i] {
bestSeats[bestPaths[i][j]] = byte('0' + i)
}
}
printBestSeats(inp, bestSeats)
fmt.Println("Seats:", len(bestSeats))
}
var bestPaths [][]h.Coordinate
func solve(inp h.CoordByteMap, start CD, end h.Coordinate, score int, currPath []h.Coordinate) int {
// tryMove takes the cd that we're moving to and the cost to move there
// and returns the cost to get from that cd to the end
tryMove := func(c CD, cost int) int {
if inp.ContainsCoord(c.c) && inp.Get(c.c) != '#' {
// printPathMap(inp, c, end, currPath)
// poi := h.Coordinate{X: 3, Y: 10}
// time.Sleep(time.Second / 20)
nextScore := score + cost
v, ok := bestCostToEnd[c.c]
//if c.c.Equals(poi) {
// fmt.Println("Current Scoretrack[poi] =", v)
// fmt.Println("Next Score =", nextScore)
// time.Sleep(time.Second * 5)
//}
if !ok || v >= nextScore {
nxtPath := make([]h.Coordinate, len(currPath))
copy(nxtPath, currPath)
nxtPath = append(nxtPath, c.c)
// Check end conditions
if c.c.Equals(end) {
if !ok || v > nextScore { // New Best
fmt.Println("New Best Path")
scoreTrack[end] = nextScore
bestPaths = [][]h.Coordinate{nxtPath}
} else if v == nextScore { // Another Best Path
fmt.Println("Adding path to best paths")
bestPaths = append(bestPaths, nxtPath)
}
return cost
}
// Not the end, but keep going
scoreTrack[c.c] = nextScore
solve(inp, c, end, nextScore, nxtPath)
}
}
return h.MAX_INT
}
// Test forward
cost := tryMove(start.move(), 1)
// Test CW
if wrk := tryMove(start.turnCW().move(), 1001); wrk < cost {
cost = wrk
}
// Test CCW
if wrk := tryMove(start.turnCCW().move(), 1001); wrk < cost {
cost = wrk
}
bestCostToEnd[start.c] = cost
return cost
}
func printPathMap(inp h.CoordByteMap, loc CD, end h.Coordinate, path []h.Coordinate) {
fmt.Print(h.CLEAR_SCREEN)
wrk := inp.Copy()
wrk.ReplaceAll('.', ' ')
for i := range path {
wrk.Put(path[i], 'o')
}
wrk.Put(loc.c, loc.Byte())
fmt.Println(wrk)
if v, ok := scoreTrack[end]; ok {
fmt.Printf("Best Score: %v (Paths: %d)\n", v, len(bestPaths))
} else {
fmt.Println("Waiting on best score...")
}
}
func printBestSeats(inp h.CoordByteMap, seats map[h.Coordinate]byte) {
fmt.Print(h.CLEAR_SCREEN)
wrk := inp.Copy()
wrk.ReplaceAll('.', ' ')
for k, v := range seats {
wrk.Put(k, byte(0+v))
}
fmt.Println(wrk)
}
/*
func part2(inpS []string) {
inp := h.StringSliceToCoordByteMap(inpS)
scoreTrack = make(map[h.Coordinate]int)
start, _ := inp.FindFirst('S')
end, _ := inp.FindFirst('E')
inp.Put(start, '.')
cd := CD{c: start, d: E}
lookForSeats(inp, cd, end, 0, []h.Coordinate{cd.c})
_, ok := scoreTrack[end]
if !ok {
panic(errors.New("no path to end found"))
}
bestSeats := make(map[h.Coordinate]int)
for i := range bestPaths {
for j := range bestPaths[i] {
bestSeats[bestPaths[i][j]] = i
}
}
fmt.Println("Number of Seats:", len(bestSeats))
}
func coordInPath(c h.Coordinate, path []h.Coordinate) bool {
for i := range path {
if path[i].Equals(c) {
return true
}
}
return false
}
func lookForSeats(inp h.CoordByteMap, start CD, end h.Coordinate, score int, path []h.Coordinate) int {
// Check for finished:
if start.c.Equals(end) {
v, ok := scoreTrack[end]
if !ok || v > score {
// We have a new best path
bestPaths = [][]h.Coordinate{path}
scoreTrack[end] = score
} else if scoreTrack[end] == score {
bestPaths = append(bestPaths, path)
}
return score
}
// Helper func
canMoveTo := func(p h.Coordinate) bool {
return inp.ContainsCoord(p) && inp.Get(p) != '#'
}
// Keep moving:
tryMove := func(c CD, cost int) {
if canMoveTo(c.c) {
// Check if this path has alread gone through this spot
nxtPath := make([]h.Coordinate, len(path))
copy(nxtPath, path)
if coordInPath(c.c, nxtPath) {
return
}
// Ok, now what's the best score we end up if we make this move?
nextScore := score + cost
n, ok := scoreTrack[c.c]
if !ok || n > nextScore {
lookForSeats(inp, c, end, nextScore, append(nxtPath, c.c))
}
}
}
// Test forward
tryMove(start.move(), 1)
// Test CW
tryMove(start.turnCW().move(), 1001)
// Test CCW
tryMove(start.turnCCW().move(), 1001)
return scoreTrack[start.c]
}
*/
type CD struct {
c h.Coordinate
d h.Coordinate
}
func (cd CD) move() CD {
return CD{
c: cd.c.Add(cd.d),
d: cd.d,
}
}
func (cd CD) turnCW() CD {
var newD h.Coordinate
switch cd.d {
case N:
newD = E
case E:
newD = S
case S:
newD = W
case W:
newD = N
}
return CD{
c: cd.c,
d: newD,
}
}
func (cd CD) turnCCW() CD {
var newD h.Coordinate
switch cd.d {
case N:
newD = W
case E:
newD = N
case S:
newD = E
case W:
newD = S
}
return CD{
c: cd.c,
d: newD,
}
}
func (cd CD) Byte() byte {
switch cd.d {
case N:
return '^'
case E:
return '>'
case S:
return 'v'
case W:
return '<'
}
return '?'
}

190
2024/day16/problem Normal file
View File

@ -0,0 +1,190 @@
Advent of Code
--- Day 16: Reindeer Maze ---
It's time again for the [16]Reindeer Olympics! This year, the big event is
the Reindeer Maze, where the Reindeer compete for the lowest score.
You and The Historians arrive to search for the Chief right as the event
is about to start. It wouldn't hurt to watch a little, right?
The Reindeer start on the Start Tile (marked S) facing East and need to
reach the End Tile (marked E). They can move forward one tile at a time
(increasing their score by 1 point), but never into a wall (#). They can
also rotate clockwise or counterclockwise 90 degrees at a time (increasing
their score by 1000 points).
To figure out the best place to sit, you start by grabbing a map (your
puzzle input) from a nearby kiosk. For example:
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############
There are many paths through this maze, but taking any of the best paths
would incur a score of only 7036. This can be achieved by taking a total
of 36 steps forward and turning 90 degrees a total of 7 times:
###############
#.......#....E#
#.#.###.#.###^#
#.....#.#...#^#
#.###.#####.#^#
#.#.#.......#^#
#.#.#####.###^#
#..>>>>>>>>v#^#
###^#.#####v#^#
#>>^#.....#v#^#
#^#.#.###.#v#^#
#^....#...#v#^#
#^###.#.#.#v#^#
#S..#.....#>>^#
###############
Here's a second example:
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################
In this maze, the best paths cost 11048 points; following one such path
would look like this:
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#^#
#.#.#.#...#...#^#
#.#.#.#.###.#.#^#
#>>v#.#.#.....#^#
#^#v#.#.#.#####^#
#^#v..#.#.#>>>>^#
#^#v#####.#^###.#
#^#v#..>>>>^#...#
#^#v###^#####.###
#^#v#>>^#.....#.#
#^#v#^#####.###.#
#^#v#^........#.#
#^#v#^#########.#
#S#>>^..........#
#################
Note that the path shown above includes one 90 degree turn as the very
first move, rotating the Reindeer from facing East to facing North.
Analyze your map carefully. What is the lowest score a Reindeer could
possibly get?
Your puzzle answer was 72400.
--- Part Two ---
Now that you know what the best paths look like, you can figure out the
best spot to sit.
Every non-wall tile (S, ., or E) is equipped with places to sit along the
edges of the tile. While determining which of these tiles would be the
best spot to sit depends on a whole bunch of factors (how comfortable the
seats are, how far away the bathrooms are, whether there's a pillar
blocking your view, etc.), the most important factor is whether the tile
is on one of the best paths through the maze. If you sit somewhere else,
you'd miss all the action!
So, you'll need to determine which tiles are part of any best path through
the maze, including the S and E tiles.
In the first example, there are 45 tiles (marked O) that are part of at
least one of the various best paths through the maze:
###############
#.......#....O#
#.#.###.#.###O#
#.....#.#...#O#
#.###.#####.#O#
#.#.#.......#O#
#.#.#####.###O#
#..OOOOOOOOO#O#
###O#O#####O#O#
#OOO#O....#O#O#
#O#O#O###.#O#O#
#OOOOO#...#O#O#
#O###.#.#.#O#O#
#O..#.....#OOO#
###############
In the second example, there are 64 tiles that are part of at least one of
the best paths:
#################
#...#...#...#..O#
#.#.#.#.#.#.#.#O#
#.#.#.#...#...#O#
#.#.#.#.###.#.#O#
#OOO#.#.#.....#O#
#O#O#.#.#.#####O#
#O#O..#.#.#OOOOO#
#O#O#####.#O###O#
#O#O#..OOOOO#OOO#
#O#O###O#####O###
#O#O#OOO#..OOO#.#
#O#O#O#####O###.#
#O#O#OOOOOOO..#.#
#O#O#O#########.#
#O#OOO..........#
#################
Analyze your map further. How many tiles are part of at least one of the
best paths through the maze?
Your puzzle answer was 435.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [17]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [18]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2015/day/14
17. https://adventofcode.com/2024
18. https://adventofcode.com/2024/day/16/input

168
2024/day17/problem Normal file
View File

@ -0,0 +1,168 @@
Advent of Code
--- Day 17: Chronospatial Computer ---
The Historians push the button on their strange device, but this time, you
all just feel like you're [16]falling.
"Situation critical", the device announces in a familiar voice.
"Bootstrapping process failed. Initializing debugger...."
The small handheld device suddenly unfolds into an entire computer! The
Historians look around nervously before one of them tosses it to you.
This seems to be a 3-bit computer: its program is a list of 3-bit numbers
(0 through 7), like 0,1,2,3. The computer also has three registers named
A, B, and C, but these registers aren't limited to 3 bits and can instead
hold any integer.
The computer knows eight instructions, each identified by a 3-bit number
(called the instruction's opcode). Each instruction also reads the 3-bit
number after it as an input; this is called its operand.
A number called the instruction pointer identifies the position in the
program from which the next opcode will be read; it starts at 0, pointing
at the first 3-bit number in the program. Except for jump instructions,
the instruction pointer increases by 2 after each instruction is processed
(to move past the instruction's opcode and its operand). If the computer
tries to read an opcode past the end of the program, it instead halts.
So, the program 0,1,2,3 would run the instruction whose opcode is 0 and
pass it the operand 1, then run the instruction having opcode 2 and pass
it the operand 3, then halt.
There are two types of operands; each instruction specifies the type of
its operand. The value of a literal operand is the operand itself. For
example, the value of the literal operand 7 is the number 7. The value of
a combo operand can be found as follows:
 Combo operands 0 through 3 represent literal values 0 through 3.
 Combo operand 4 represents the value of register A.
 Combo operand 5 represents the value of register B.
 Combo operand 6 represents the value of register C.
 Combo operand 7 is reserved and will not appear in valid programs.
The eight instructions are as follows:
The adv instruction (opcode 0) performs division. The numerator is the
value in the A register. The denominator is found by raising 2 to the
power of the instruction's combo operand. (So, an operand of 2 would
divide A by 4 (2^2); an operand of 5 would divide A by 2^B.) The result of
the division operation is truncated to an integer and then written to the
A register.
The bxl instruction (opcode 1) calculates the [17]bitwise XOR of register
B and the instruction's literal operand, then stores the result in
register B.
The bst instruction (opcode 2) calculates the value of its combo operand
[18]modulo 8 (thereby keeping only its lowest 3 bits), then writes that
value to the B register.
The jnz instruction (opcode 3) does nothing if the A register is 0.
However, if the A register is not zero, it jumps by setting the
instruction pointer to the value of its literal operand; if this
instruction jumps, the instruction pointer is not increased by 2 after
this instruction.
The bxc instruction (opcode 4) calculates the bitwise XOR of register B
and register C, then stores the result in register B. (For legacy reasons,
this instruction reads an operand but ignores it.)
The out instruction (opcode 5) calculates the value of its combo operand
modulo 8, then outputs that value. (If a program outputs multiple values,
they are separated by commas.)
The bdv instruction (opcode 6) works exactly like the adv instruction
except that the result is stored in the B register. (The numerator is
still read from the A register.)
The cdv instruction (opcode 7) works exactly like the adv instruction
except that the result is stored in the C register. (The numerator is
still read from the A register.)
Here are some examples of instruction operation:
 If register C contains 9, the program 2,6 would set register B to 1.
 If register A contains 10, the program 5,0,5,1,5,4 would output 0,1,2.
 If register A contains 2024, the program 0,1,5,4,3,0 would output
4,2,5,6,7,7,7,7,3,1,0 and leave 0 in register A.
 If register B contains 29, the program 1,7 would set register B to 26.
 If register B contains 2024 and register C contains 43690, the program
4,0 would set register B to 44354.
The Historians' strange device has finished initializing its debugger and
is displaying some information about the program it is trying to run (your
puzzle input). For example:
Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0
Your first task is to determine what the program is trying to output. To
do this, initialize the registers to the given values, then run the given
program, collecting any output produced by out instructions. (Always join
the values produced by out instructions with commas.) After the above
program halts, its final output will be 4,6,3,5,6,3,5,2,1,0.
Using the information provided by the debugger, initialize the registers
to the given values, then run the program. Once it halts, what do you get
if you use commas to join the values it output into a single string?
Your puzzle answer was 2,7,6,5,6,0,2,3,1.
--- Part Two ---
Digging deeper in the device's manual, you discover the problem: this
program is supposed to output another copy of the program! Unfortunately,
the value in register A seems to have been corrupted. You'll need to find
a new value to which you can initialize register A so that the program's
output instructions produce an exact copy of the program itself.
For example:
Register A: 2024
Register B: 0
Register C: 0
Program: 0,3,5,4,3,0
This program outputs a copy of itself if register A is instead initialized
to 117440. (The original initial value of register A, 2024, is ignored.)
What is the lowest positive initial value for register A that causes the
program to output a copy of itself?
Your puzzle answer was 107416870455451.
Both parts of this puzzle are complete! They provide two gold stars: **
At this point, you should [19]return to your Advent calendar and try
another puzzle.
If you still want to see it, you can [20]get your puzzle input.
References
Visible links
1. https://adventofcode.com/
2. https://adventofcode.com/2024/about
3. https://adventofcode.com/2024/events
4. https://cottonbureau.com/people/advent-of-code
5. https://adventofcode.com/2024/settings
6. https://adventofcode.com/2024/auth/logout
7. Advent of Code Supporter
https://adventofcode.com/2024/support
8. https://adventofcode.com/2024
9. https://adventofcode.com/2024
10. https://adventofcode.com/2024/support
11. https://adventofcode.com/2024/sponsors
12. https://adventofcode.com/2024/leaderboard
13. https://adventofcode.com/2024/stats
16. https://adventofcode.com/2018/day/6
17. https://en.wikipedia.org/wiki/Bitwise_operation#XOR
18. https://en.wikipedia.org/wiki/Modulo
19. https://adventofcode.com/2024
20. https://adventofcode.com/2024/day/17/input