233 lines
6.2 KiB
Org Mode
233 lines
6.2 KiB
Org Mode
** --- Day 14: Regolith Reservoir ---
|
|
The distress signal leads you to a giant waterfall! Actually, hang on -
|
|
the signal seems like it's coming from the waterfall itself, and that
|
|
doesn't make any sense. However, you do notice a little path that leads
|
|
/behind/ the waterfall.
|
|
|
|
Correction: the distress signal leads you behind a giant waterfall!
|
|
There seems to be a large cave system here, and the signal definitely
|
|
leads further inside.
|
|
|
|
As you begin to make your way deeper underground, you feel the ground
|
|
rumble for a moment. Sand begins pouring into the cave! If you don't
|
|
quickly figure out where the sand is going, you could quickly become
|
|
trapped!
|
|
|
|
Fortunately, your [[/2018/day/17][familiarity]] with analyzing the path
|
|
of falling material will come in handy here. You scan a two-dimensional
|
|
vertical slice of the cave above you (your puzzle input) and discover
|
|
that it is mostly /air/ with structures made of /rock/.
|
|
|
|
Your scan traces the path of each solid rock structure and reports the
|
|
=x,y= coordinates that form the shape of the path, where =x= represents
|
|
distance to the right and =y= represents distance down. Each path
|
|
appears as a single line of text in your scan. After the first point of
|
|
each path, each point indicates the end of a straight horizontal or
|
|
vertical line to be drawn from the previous point. For example:
|
|
|
|
#+begin_example
|
|
498,4 -> 498,6 -> 496,6
|
|
503,4 -> 502,4 -> 502,9 -> 494,9
|
|
#+end_example
|
|
|
|
This scan means that there are two paths of rock; the first path
|
|
consists of two straight lines, and the second path consists of three
|
|
straight lines. (Specifically, the first path consists of a line of rock
|
|
from =498,4= through =498,6= and another line of rock from =498,6=
|
|
through =496,6=.)
|
|
|
|
The sand is pouring into the cave from point =500,0=.
|
|
|
|
Drawing rock as =#=, air as =.=, and the source of the sand as =+=, this
|
|
becomes:
|
|
|
|
#+begin_example
|
|
4 5 5
|
|
9 0 0
|
|
4 0 3
|
|
0 ......+...
|
|
1 ..........
|
|
2 ..........
|
|
3 ..........
|
|
4 ....#...##
|
|
5 ....#...#.
|
|
6 ..###...#.
|
|
7 ........#.
|
|
8 ........#.
|
|
9 #########.
|
|
#+end_example
|
|
|
|
Sand is produced /one unit at a time/, and the next unit of sand is not
|
|
produced until the previous unit of sand /comes to rest/. A unit of sand
|
|
is large enough to fill one tile of air in your scan.
|
|
|
|
A unit of sand always falls /down one step/ if possible. If the tile
|
|
immediately below is blocked (by rock or sand), the unit of sand
|
|
attempts to instead move diagonally /one step down and to the left/. If
|
|
that tile is blocked, the unit of sand attempts to instead move
|
|
diagonally /one step down and to the right/. Sand keeps moving as long
|
|
as it is able to do so, at each step trying to move down, then
|
|
down-left, then down-right. If all three possible destinations are
|
|
blocked, the unit of sand /comes to rest/ and no longer moves, at which
|
|
point the next unit of sand is created back at the source.
|
|
|
|
So, drawing sand that has come to rest as =o=, the first unit of sand
|
|
simply falls straight down and then stops:
|
|
|
|
#+begin_example
|
|
......+...
|
|
..........
|
|
..........
|
|
..........
|
|
....#...##
|
|
....#...#.
|
|
..###...#.
|
|
........#.
|
|
......o.#.
|
|
#########.
|
|
#+end_example
|
|
|
|
The second unit of sand then falls straight down, lands on the first
|
|
one, and then comes to rest to its left:
|
|
|
|
#+begin_example
|
|
......+...
|
|
..........
|
|
..........
|
|
..........
|
|
....#...##
|
|
....#...#.
|
|
..###...#.
|
|
........#.
|
|
.....oo.#.
|
|
#########.
|
|
#+end_example
|
|
|
|
After a total of five units of sand have come to rest, they form this
|
|
pattern:
|
|
|
|
#+begin_example
|
|
......+...
|
|
..........
|
|
..........
|
|
..........
|
|
....#...##
|
|
....#...#.
|
|
..###...#.
|
|
......o.#.
|
|
....oooo#.
|
|
#########.
|
|
#+end_example
|
|
|
|
After a total of 22 units of sand:
|
|
|
|
#+begin_example
|
|
......+...
|
|
..........
|
|
......o...
|
|
.....ooo..
|
|
....#ooo##
|
|
....#ooo#.
|
|
..###ooo#.
|
|
....oooo#.
|
|
...ooooo#.
|
|
#########.
|
|
#+end_example
|
|
|
|
Finally, only two more units of sand can possibly come to rest:
|
|
|
|
#+begin_example
|
|
......+...
|
|
..........
|
|
......o...
|
|
.....ooo..
|
|
....#ooo##
|
|
...o#ooo#.
|
|
..###ooo#.
|
|
....oooo#.
|
|
.o.ooooo#.
|
|
#########.
|
|
#+end_example
|
|
|
|
Once all =24= units of sand shown above have come to rest, all further
|
|
sand flows out the bottom, falling into the endless void. Just for fun,
|
|
the path any new sand takes before falling forever is shown here with
|
|
=~=:
|
|
|
|
#+begin_example
|
|
.......+...
|
|
.......~...
|
|
......~o...
|
|
.....~ooo..
|
|
....~#ooo##
|
|
...~o#ooo#.
|
|
..~###ooo#.
|
|
..~..oooo#.
|
|
.~o.ooooo#.
|
|
~#########.
|
|
~..........
|
|
~..........
|
|
~..........
|
|
#+end_example
|
|
|
|
Using your scan, simulate the falling sand. /How many units of sand come
|
|
to rest before sand starts flowing into the abyss below?/
|
|
|
|
Your puzzle answer was =665=.
|
|
|
|
** --- Part Two ---
|
|
You realize you misread the scan. There isn't an endless void at the
|
|
bottom of the scan - there's floor, and you're standing on it!
|
|
|
|
You don't have time to scan the floor, so assume the floor is an
|
|
infinite horizontal line with a =y= coordinate equal to /two plus the
|
|
highest =y= coordinate/ of any point in your scan.
|
|
|
|
In the example above, the highest =y= coordinate of any point is =9=,
|
|
and so the floor is at =y=11=. (This is as if your scan contained one
|
|
extra rock path like =-infinity,11 -> infinity,11=.) With the added
|
|
floor, the example above now looks like this:
|
|
|
|
#+begin_example
|
|
...........+........
|
|
....................
|
|
....................
|
|
....................
|
|
.........#...##.....
|
|
.........#...#......
|
|
.......###...#......
|
|
.............#......
|
|
.............#......
|
|
.....#########......
|
|
....................
|
|
<-- etc #################### etc -->
|
|
#+end_example
|
|
|
|
To find somewhere safe to stand, you'll need to simulate falling sand
|
|
until a unit of sand comes to rest at =500,0=, blocking the source
|
|
entirely and stopping the flow of sand into the cave. In the example
|
|
above, the situation finally looks like this after =93= units of sand
|
|
come to rest:
|
|
|
|
#+begin_example
|
|
............o............
|
|
...........ooo...........
|
|
..........ooooo..........
|
|
.........ooooooo.........
|
|
........oo#ooo##o........
|
|
.......ooo#ooo#ooo.......
|
|
......oo###ooo#oooo......
|
|
.....oooo.oooo#ooooo.....
|
|
....oooooooooo#oooooo....
|
|
...ooo#########ooooooo...
|
|
..ooooo.......ooooooooo..
|
|
#########################
|
|
#+end_example
|
|
|
|
Using your scan, simulate the falling sand until the source of the sand
|
|
becomes blocked. /How many units of sand come to rest?/
|
|
|
|
Your puzzle answer was =25434=.
|
|
|
|
Both parts of this puzzle are complete! They provide two gold stars: **
|