160 lines
6.4 KiB
Plaintext
160 lines
6.4 KiB
Plaintext
|
Advent of Code
|
|||
|
|
|||
|
--- Day 21: Springdroid Adventure ---
|
|||
|
|
|||
|
You lift off from Pluto and start flying in the direction of Santa.
|
|||
|
|
|||
|
While experimenting further with the tractor beam, you accidentally pull an asteroid directly into your ship! It deals
|
|||
|
significant damage to your hull and causes your ship to begin tumbling violently.
|
|||
|
|
|||
|
You can send a droid out to investigate, but the tumbling is causing enough artificial gravity that one wrong step could send
|
|||
|
the droid through a hole in the hull and flying out into space.
|
|||
|
|
|||
|
The clear choice for this mission is a droid that can jump over the holes in the hull - a springdroid.
|
|||
|
|
|||
|
You can use an Intcode program (your puzzle input) running on an ASCII-capable computer to program the springdroid. However,
|
|||
|
springdroids don't run Intcode; instead, they run a simplified assembly language called springscript.
|
|||
|
|
|||
|
While a springdroid is certainly capable of navigating the artificial gravity and giant holes, it has one downside: it can
|
|||
|
only remember at most 15 springscript instructions.
|
|||
|
|
|||
|
The springdroid will move forward automatically, constantly thinking about whether to jump. The springscript program defines
|
|||
|
the logic for this decision.
|
|||
|
|
|||
|
Springscript programs only use Boolean values, not numbers or strings. Two registers are available: T, the temporary value
|
|||
|
register, and J, the jump register. If the jump register is true at the end of the springscript program, the springdroid will
|
|||
|
try to jump. Both of these registers start with the value false.
|
|||
|
|
|||
|
Springdroids have a sensor that can detect whether there is ground at various distances in the direction it is facing; these
|
|||
|
values are provided in read-only registers. Your springdroid can detect ground at four distances: one tile away (A), two
|
|||
|
tiles away (B), three tiles away (C), and four tiles away (D). If there is ground at the given distance, the register will be
|
|||
|
true; if there is a hole, the register will be false.
|
|||
|
|
|||
|
There are only three instructions available in springscript:
|
|||
|
|
|||
|
• AND X Y sets Y to true if both X and Y are true; otherwise, it sets Y to false.
|
|||
|
• OR X Y sets Y to true if at least one of X or Y is true; otherwise, it sets Y to false.
|
|||
|
• NOT X Y sets Y to true if X is false; otherwise, it sets Y to false.
|
|||
|
|
|||
|
In all three instructions, the second argument (Y) needs to be a writable register (either T or J). The first argument (X)
|
|||
|
can be any register (including A, B, C, or D).
|
|||
|
|
|||
|
For example, the one-instruction program NOT A J means "if the tile immediately in front of me is not ground, jump".
|
|||
|
|
|||
|
Or, here is a program that jumps if a three-tile-wide hole (with ground on the other side of the hole) is detected:
|
|||
|
|
|||
|
NOT A J
|
|||
|
NOT B T
|
|||
|
AND T J
|
|||
|
NOT C T
|
|||
|
AND T J
|
|||
|
AND D J
|
|||
|
|
|||
|
The Intcode program expects ASCII inputs and outputs. It will begin by displaying a prompt; then, input the desired
|
|||
|
instructions one per line. End each line with a newline (ASCII code 10). When you have finished entering your program,
|
|||
|
provide the command WALK followed by a newline to instruct the springdroid to begin surveying the hull.
|
|||
|
|
|||
|
If the springdroid falls into space, an ASCII rendering of the last moments of its life will be produced. In these, @ is the
|
|||
|
springdroid, # is hull, and . is empty space. For example, suppose you program the springdroid like this:
|
|||
|
|
|||
|
NOT D J
|
|||
|
WALK
|
|||
|
|
|||
|
This one-instruction program sets J to true if and only if there is no ground four tiles away. In other words, it attempts to
|
|||
|
jump into any hole it finds:
|
|||
|
|
|||
|
.................
|
|||
|
.................
|
|||
|
@................
|
|||
|
#####.###########
|
|||
|
|
|||
|
.................
|
|||
|
.................
|
|||
|
.@...............
|
|||
|
#####.###########
|
|||
|
|
|||
|
.................
|
|||
|
..@..............
|
|||
|
.................
|
|||
|
#####.###########
|
|||
|
|
|||
|
...@.............
|
|||
|
.................
|
|||
|
.................
|
|||
|
#####.###########
|
|||
|
|
|||
|
.................
|
|||
|
....@............
|
|||
|
.................
|
|||
|
#####.###########
|
|||
|
|
|||
|
.................
|
|||
|
.................
|
|||
|
.....@...........
|
|||
|
#####.###########
|
|||
|
|
|||
|
.................
|
|||
|
.................
|
|||
|
.................
|
|||
|
#####@###########
|
|||
|
|
|||
|
However, if the springdroid successfully makes it across, it will use an output instruction to indicate the amount of damage
|
|||
|
to the hull as a single giant integer outside the normal ASCII range.
|
|||
|
|
|||
|
Program the springdroid with logic that allows it to survey the hull without falling into space. What amount of hull damage
|
|||
|
does it report?
|
|||
|
|
|||
|
Your puzzle answer was 19354818.
|
|||
|
|
|||
|
--- Part Two ---
|
|||
|
|
|||
|
There are many areas the springdroid can't reach. You flip through the manual and discover a way to increase its sensor
|
|||
|
range.
|
|||
|
|
|||
|
Instead of ending your springcode program with WALK, use RUN. Doing this will enable extended sensor mode, capable of sensing
|
|||
|
ground up to nine tiles away. This data is available in five new read-only registers:
|
|||
|
|
|||
|
• Register E indicates whether there is ground five tiles away.
|
|||
|
• Register F indicates whether there is ground six tiles away.
|
|||
|
• Register G indicates whether there is ground seven tiles away.
|
|||
|
• Register H indicates whether there is ground eight tiles away.
|
|||
|
• Register I indicates whether there is ground nine tiles away.
|
|||
|
|
|||
|
All other functions remain the same.
|
|||
|
|
|||
|
Successfully survey the rest of the hull by ending your program with RUN. What amount of hull damage does the springdroid now
|
|||
|
report?
|
|||
|
|
|||
|
Your puzzle answer was 1143787220.
|
|||
|
|
|||
|
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/Artificial_gravity
|
|||
|
. https://adventofcode.com/2019/day/9
|
|||
|
. https://adventofcode.com/2019/day/17
|
|||
|
. https://en.wikipedia.org/wiki/Programmable_read-only_memory
|
|||
|
. https://en.wikipedia.org/wiki/Boolean_data_type
|
|||
|
. https://adventofcode.com/2019
|
|||
|
. https://adventofcode.com/2019/day/21/input
|