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
 |