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
|