Add 2019 Problems
This commit is contained in:
192
2019/day17/problem
Normal file
192
2019/day17/problem
Normal file
@@ -0,0 +1,192 @@
|
||||
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
|
Reference in New Issue
Block a user