193 lines
8.7 KiB
Plaintext
193 lines
8.7 KiB
Plaintext
|
Advent of Code
|
|||
|
|
|||
|
--- Day 17: Set and Forget ---
|
|||
|
|
|||
|
An early warning system detects an incoming solar flare and automatically activates the ship's electromagnetic shield.
|
|||
|
Unfortunately, this has cut off the Wi-Fi for many small robots that, unaware of the impending danger, are now trapped on
|
|||
|
exterior scaffolding on the unsafe side of the shield. To rescue them, you'll have to act quickly!
|
|||
|
|
|||
|
The only tools at your disposal are some wired cameras and a small vacuum robot currently asleep at its charging station. The
|
|||
|
video quality is poor, but the vacuum robot has a needlessly bright LED that makes it easy to spot no matter where it is.
|
|||
|
|
|||
|
An Intcode program, the Aft Scaffolding Control and Information Interface (ASCII, your puzzle input), provides access to the
|
|||
|
cameras and the vacuum robot. Currently, because the vacuum robot is asleep, you can only access the cameras.
|
|||
|
|
|||
|
Running the ASCII program on your Intcode computer will provide the current view of the scaffolds. This is output, purely
|
|||
|
coincidentally, as ASCII code: 35 means #, 46 means ., 10 starts a new line of output below the current one, and so on.
|
|||
|
(Within a line, characters are drawn left-to-right.)
|
|||
|
|
|||
|
In the camera output, # represents a scaffold and . represents open space. The vacuum robot is visible as ^, v, <, or >
|
|||
|
depending on whether it is facing up, down, left, or right respectively. When drawn like this, the vacuum robot is always on
|
|||
|
a scaffold; if the vacuum robot ever walks off of a scaffold and begins tumbling through space uncontrollably, it will
|
|||
|
instead be visible as X.
|
|||
|
|
|||
|
In general, the scaffold forms a path, but it sometimes loops back onto itself. For example, suppose you can see the
|
|||
|
following view from the cameras:
|
|||
|
|
|||
|
..#..........
|
|||
|
..#..........
|
|||
|
#######...###
|
|||
|
#.#...#...#.#
|
|||
|
#############
|
|||
|
..#...#...#..
|
|||
|
..#####...^..
|
|||
|
|
|||
|
Here, the vacuum robot, ^ is facing up and sitting at one end of the scaffold near the bottom-right of the image. The
|
|||
|
scaffold continues up, loops across itself several times, and ends at the top-left of the image.
|
|||
|
|
|||
|
The first step is to calibrate the cameras by getting the alignment parameters of some well-defined points. Locate all
|
|||
|
scaffold intersections; for each, its alignment parameter is the distance between its left edge and the left edge of the view
|
|||
|
multiplied by the distance between its top edge and the top edge of the view. Here, the intersections from the above image
|
|||
|
are marked O:
|
|||
|
|
|||
|
..#..........
|
|||
|
..#..........
|
|||
|
##O####...###
|
|||
|
#.#...#...#.#
|
|||
|
##O###O###O##
|
|||
|
..#...#...#..
|
|||
|
..#####...^..
|
|||
|
|
|||
|
For these intersections:
|
|||
|
|
|||
|
• The top-left intersection is 2 units from the left of the image and 2 units from the top of the image, so its alignment
|
|||
|
parameter is 2 * 2 = 4.
|
|||
|
• The bottom-left intersection is 2 units from the left and 4 units from the top, so its alignment parameter is 2 * 4 = 8.
|
|||
|
• The bottom-middle intersection is 6 from the left and 4 from the top, so its alignment parameter is 24.
|
|||
|
• The bottom-right intersection's alignment parameter is 40.
|
|||
|
|
|||
|
To calibrate the cameras, you need the sum of the alignment parameters. In the above example, this is 76.
|
|||
|
|
|||
|
Run your ASCII program. What is the sum of the alignment parameters for the scaffold intersections?
|
|||
|
|
|||
|
Your puzzle answer was 3336.
|
|||
|
|
|||
|
--- Part Two ---
|
|||
|
|
|||
|
Now for the tricky part: notifying all the other robots about the solar flare. The vacuum robot can do this automatically if
|
|||
|
it gets into range of a robot. However, you can't see the other robots on the camera, so you need to be thorough instead: you
|
|||
|
need to make the vacuum robot visit every part of the scaffold at least once.
|
|||
|
|
|||
|
The vacuum robot normally wanders randomly, but there isn't time for that today. Instead, you can override its movement logic
|
|||
|
with new rules.
|
|||
|
|
|||
|
Force the vacuum robot to wake up by changing the value in your ASCII program at address 0 from 1 to 2. When you do this, you
|
|||
|
will be automatically prompted for the new movement rules that the vacuum robot should use. The ASCII program will use input
|
|||
|
instructions to receive them, but they need to be provided as ASCII code; end each line of logic with a single newline, ASCII
|
|||
|
code 10.
|
|||
|
|
|||
|
First, you will be prompted for the main movement routine. The main routine may only call the movement functions: A, B, or C.
|
|||
|
Supply the movement functions to use as ASCII text, separating them with commas (,, ASCII code 44), and ending the list with
|
|||
|
a newline (ASCII code 10). For example, to call A twice, then alternate between B and C three times, provide the string
|
|||
|
A,A,B,C,B,C,B,C and then a newline.
|
|||
|
|
|||
|
Then, you will be prompted for each movement function. Movement functions may use L to turn left, R to turn right, or a
|
|||
|
number to move forward that many units. Movement functions may not call other movement functions. Again, separate the actions
|
|||
|
with commas and end the list with a newline. For example, to move forward 10 units, turn left, move forward 8 units, turn
|
|||
|
right, and finally move forward 6 units, provide the string 10,L,8,R,6 and then a newline.
|
|||
|
|
|||
|
Finally, you will be asked whether you want to see a continuous video feed; provide either y or n and a newline. Enabling the
|
|||
|
continuous video feed can help you see what's going on, but it also requires a significant amount of processing power, and
|
|||
|
may even cause your Intcode computer to overheat.
|
|||
|
|
|||
|
Due to the limited amount of memory in the vacuum robot, the ASCII definitions of the main routine and the movement functions
|
|||
|
may each contain at most 20 characters, not counting the newline.
|
|||
|
|
|||
|
For example, consider the following camera feed:
|
|||
|
|
|||
|
#######...#####
|
|||
|
#.....#...#...#
|
|||
|
#.....#...#...#
|
|||
|
......#...#...#
|
|||
|
......#...###.#
|
|||
|
......#.....#.#
|
|||
|
^########...#.#
|
|||
|
......#.#...#.#
|
|||
|
......#########
|
|||
|
........#...#..
|
|||
|
....#########..
|
|||
|
....#...#......
|
|||
|
....#...#......
|
|||
|
....#...#......
|
|||
|
....#####......
|
|||
|
|
|||
|
In order for the vacuum robot to visit every part of the scaffold at least once, one path it could take is:
|
|||
|
|
|||
|
R,8,R,8,R,4,R,4,R,8,L,6,L,2,R,4,R,4,R,8,R,8,R,8,L,6,L,2
|
|||
|
|
|||
|
Without the memory limit, you could just supply this whole string to function A and have the main routine call A once.
|
|||
|
However, you'll need to split it into smaller parts.
|
|||
|
|
|||
|
One approach is:
|
|||
|
|
|||
|
• Main routine: A,B,C,B,A,C
|
|||
|
(ASCII input: 65, 44, 66, 44, 67, 44, 66, 44, 65, 44, 67, 10)
|
|||
|
• Function A: R,8,R,8
|
|||
|
(ASCII input: 82, 44, 56, 44, 82, 44, 56, 10)
|
|||
|
• Function B: R,4,R,4,R,8
|
|||
|
(ASCII input: 82, 44, 52, 44, 82, 44, 52, 44, 82, 44, 56, 10)
|
|||
|
• Function C: L,6,L,2
|
|||
|
(ASCII input: 76, 44, 54, 44, 76, 44, 50, 10)
|
|||
|
|
|||
|
Visually, this would break the desired path into the following parts:
|
|||
|
|
|||
|
A, B, C, B, A, C
|
|||
|
R,8,R,8, R,4,R,4,R,8, L,6,L,2, R,4,R,4,R,8, R,8,R,8, L,6,L,2
|
|||
|
|
|||
|
CCCCCCA...BBBBB
|
|||
|
C.....A...B...B
|
|||
|
C.....A...B...B
|
|||
|
......A...B...B
|
|||
|
......A...CCC.B
|
|||
|
......A.....C.B
|
|||
|
^AAAAAAAA...C.B
|
|||
|
......A.A...C.B
|
|||
|
......AAAAAA#AB
|
|||
|
........A...C..
|
|||
|
....BBBB#BBBB..
|
|||
|
....B...A......
|
|||
|
....B...A......
|
|||
|
....B...A......
|
|||
|
....BBBBA......
|
|||
|
|
|||
|
Of course, the scaffolding outside your ship is much more complex.
|
|||
|
|
|||
|
As the vacuum robot finds other robots and notifies them of the impending solar flare, it also can't help but leave them
|
|||
|
squeaky clean, collecting any space dust it finds. Once it finishes the programmed set of movements, assuming it hasn't
|
|||
|
drifted off into space, the cleaning robot will return to its docking station and report the amount of space dust it
|
|||
|
collected as a large, non-ASCII value in a single output instruction.
|
|||
|
|
|||
|
After visiting every part of the scaffold at least once, how much dust does the vacuum robot report it has collected?
|
|||
|
|
|||
|
Your puzzle answer was 597517.
|
|||
|
|
|||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
|||
|
|
|||
|
At this point, all that is left is for you to admire your Advent calendar.
|
|||
|
|
|||
|
If you still want to see it, you can get your puzzle input.
|
|||
|
|
|||
|
References
|
|||
|
|
|||
|
Visible links
|
|||
|
. https://adventofcode.com/
|
|||
|
. https://adventofcode.com/2019/about
|
|||
|
. https://adventofcode.com/2019/events
|
|||
|
. https://adventofcode.com/2019/settings
|
|||
|
. https://adventofcode.com/2019/auth/logout
|
|||
|
. Advent of Code Supporter
|
|||
|
https://adventofcode.com/2019/support
|
|||
|
. https://adventofcode.com/2019
|
|||
|
. https://adventofcode.com/2019
|
|||
|
. https://adventofcode.com/2019/support
|
|||
|
. https://adventofcode.com/2019/sponsors
|
|||
|
. https://adventofcode.com/2019/leaderboard
|
|||
|
. https://adventofcode.com/2019/stats
|
|||
|
. https://adventofcode.com/2019/sponsors
|
|||
|
. https://en.wikipedia.org/wiki/Solar_flare
|
|||
|
. https://adventofcode.com/2019/day/9
|
|||
|
. https://simple.wikipedia.org/wiki/ASCII
|
|||
|
. https://en.wikipedia.org/wiki/Newline#In_programming_languages
|
|||
|
. https://adventofcode.com/2019
|
|||
|
. https://adventofcode.com/2019/day/17/input
|