190 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Advent of Code
 | ||
| 
 | ||
| --- Day 5: Sunny with a Chance of Asteroids ---
 | ||
| 
 | ||
|    You're starting to sweat as the ship makes its way toward Mercury. The Elves
 | ||
|    suggest that you get the air conditioner working by upgrading your ship
 | ||
|    computer to support the Thermal Environment Supervision Terminal.
 | ||
| 
 | ||
|    The Thermal Environment Supervision Terminal (TEST) starts by running a
 | ||
|    diagnostic program (your puzzle input). The TEST diagnostic program will run
 | ||
|    on your existing Intcode computer after a few modifications:
 | ||
| 
 | ||
|    First, you'll need to add two new instructions:
 | ||
| 
 | ||
|      • Opcode 3 takes a single integer as input and saves it to the position
 | ||
|      given by its only parameter. For example, the instruction 3,50 would take
 | ||
|      an input value and store it at address 50. • Opcode 4 outputs the value of
 | ||
|      its only parameter. For example, the instruction 4,50 would output the
 | ||
|      value at address 50.
 | ||
| 
 | ||
|    Programs that use these instructions will come with documentation that
 | ||
|    explains what should be connected to the input and output. The program
 | ||
|    3,0,4,0,99 outputs whatever it gets as input, then halts.
 | ||
| 
 | ||
|    Second, you'll need to add support for parameter modes:
 | ||
| 
 | ||
|    Each parameter of an instruction is handled based on its parameter mode.
 | ||
|    Right now, your ship computer already understands parameter mode 0, position
 | ||
|    mode, which causes the parameter to be interpreted as a position - if the
 | ||
|    parameter is 50, its value is the value stored at address 50 in memory.
 | ||
|    Until now, all parameters have been in position mode.
 | ||
| 
 | ||
|    Now, your ship computer will also need to handle parameters in mode 1,
 | ||
|    immediate mode. In immediate mode, a parameter is interpreted as a value -
 | ||
|    if the parameter is 50, its value is simply 50.
 | ||
| 
 | ||
|    Parameter modes are stored in the same value as the instruction's opcode.
 | ||
|    The opcode is a two-digit number based only on the ones and tens digit of
 | ||
|    the value, that is, the opcode is the rightmost two digits of the first
 | ||
|    value in an instruction. Parameter modes are single digits, one per
 | ||
|    parameter, read right-to-left from the opcode: the first parameter's mode is
 | ||
|    in the hundreds digit, the second parameter's mode is in the thousands
 | ||
|    digit, the third parameter's mode is in the ten-thousands digit, and so on.
 | ||
|    Any missing modes are 0.
 | ||
| 
 | ||
|    For example, consider the program 1002,4,3,4,33.
 | ||
| 
 | ||
|    The first instruction, 1002,4,3,4, is a multiply instruction - the rightmost
 | ||
|    two digits of the first value, 02, indicate opcode 2, multiplication. Then,
 | ||
|    going right to left, the parameter modes are 0 (hundreds digit), 1
 | ||
|    (thousands digit), and 0 (ten-thousands digit, not present and therefore
 | ||
|    zero):
 | ||
| 
 | ||
|  ABCDE 1002
 | ||
| 
 | ||
|  DE - two-digit opcode,      02 == opcode 2 C - mode of 1st parameter,  0 ==
 | ||
|  position mode B - mode of 2nd parameter,  1 == immediate mode A - mode of 3rd
 | ||
|  parameter,  0 == position mode, omitted due to being a leading zero
 | ||
| 
 | ||
|    This instruction multiplies its first two parameters. The first parameter, 4
 | ||
|    in position mode, works like it did before - its value is the value stored
 | ||
|    at address 4 (33). The second parameter, 3 in immediate mode, simply has
 | ||
|    value 3. The result of this operation, 33 * 3 = 99, is written according to
 | ||
|    the third parameter, 4 in position mode, which also works like it did before
 | ||
|    - 99 is written to address 4.
 | ||
| 
 | ||
|    Parameters that an instruction writes to will never be in immediate mode.
 | ||
| 
 | ||
|    Finally, some notes:
 | ||
| 
 | ||
|      • It is important to remember that the instruction pointer should increase
 | ||
|      by the number of values in the instruction after the instruction finishes.
 | ||
|      Because of the new instructions, this amount is no longer always 4.
 | ||
|      • Integers can be negative: 1101,100,-1,4,0 is a valid program (find 100 +
 | ||
|      -1, store the result in position 4).
 | ||
| 
 | ||
|    The TEST diagnostic program will start by requesting from the user the ID of
 | ||
|    the system to test by running an input instruction - provide it 1, the ID
 | ||
|    for the ship's air conditioner unit.
 | ||
| 
 | ||
|    It will then perform a series of diagnostic tests confirming that various
 | ||
|    parts of the Intcode computer, like parameter modes, function correctly. For
 | ||
|    each test, it will run an output instruction indicating how far the result
 | ||
|    of the test was from the expected value, where 0 means the test was
 | ||
|    successful. Non-zero outputs mean that a function is not working correctly;
 | ||
|    check the instructions that were run before the output instruction to see
 | ||
|    which one failed.
 | ||
| 
 | ||
|    Finally, the program will output a diagnostic code and immediately halt.
 | ||
|    This final output isn't an error; an output followed immediately by a halt
 | ||
|    means the program finished. If all outputs were zero except the diagnostic
 | ||
|    code, the diagnostic program ran successfully.
 | ||
| 
 | ||
|    After providing 1 to the only input instruction and passing all the tests,
 | ||
|    what diagnostic code does the program produce?
 | ||
| 
 | ||
|    Your puzzle answer was 16489636.
 | ||
| 
 | ||
| --- Part Two ---
 | ||
| 
 | ||
|    The air conditioner comes online! Its cold air feels good for a while, but
 | ||
|    then the TEST alarms start to go off. Since the air conditioner can't vent
 | ||
|    its heat anywhere but back into the spacecraft, it's actually making the air
 | ||
|    inside the ship warmer.
 | ||
| 
 | ||
|    Instead, you'll need to use the TEST to extend the thermal radiators.
 | ||
|    Fortunately, the diagnostic program (your puzzle input) is already equipped
 | ||
|    for this. Unfortunately, your Intcode computer is not.
 | ||
| 
 | ||
|    Your computer is only missing a few opcodes:
 | ||
| 
 | ||
|      • Opcode 5 is jump-if-true: if the first parameter is non-zero, it sets
 | ||
|      the instruction pointer to the value from the second parameter. Otherwise,
 | ||
|      it does nothing. • Opcode 6 is jump-if-false: if the first parameter is
 | ||
|      zero, it sets the instruction pointer to the value from the second
 | ||
|      parameter. Otherwise, it does nothing. • Opcode 7 is less than: if the
 | ||
|      first parameter is less than the second parameter, it stores 1 in the
 | ||
|      position given by the third parameter. Otherwise, it stores 0. • Opcode 8
 | ||
|      is equals: if the first parameter is equal to the second parameter, it
 | ||
|      stores 1 in the position given by the third parameter. Otherwise, it
 | ||
|      stores 0.
 | ||
| 
 | ||
|    Like all instructions, these instructions need to support parameter modes as
 | ||
|    described above.
 | ||
| 
 | ||
|    Normally, after an instruction is finished, the instruction pointer
 | ||
|    increases by the number of values in that instruction. However, if the
 | ||
|    instruction modifies the instruction pointer, that value is used and the
 | ||
|    instruction pointer is not automatically increased.
 | ||
| 
 | ||
|    For example, here are several programs that take one input, compare it to
 | ||
|    the value 8, and then produce one output:
 | ||
| 
 | ||
|      • 3,9,8,9,10,9,4,9,99,-1,8 - Using position mode, consider whether the
 | ||
|      input is equal to 8; output 1 (if it is) or 0 (if it is not).
 | ||
|      • 3,9,7,9,10,9,4,9,99,-1,8 - Using position mode, consider whether the
 | ||
|      input is less than 8; output 1 (if it is) or 0 (if it is not).
 | ||
|      • 3,3,1108,-1,8,3,4,3,99 - Using immediate mode, consider whether the
 | ||
|      input is equal to 8; output 1 (if it is) or 0 (if it is not).
 | ||
|      • 3,3,1107,-1,8,3,4,3,99 - Using immediate mode, consider whether the
 | ||
|      input is less than 8; output 1 (if it is) or 0 (if it is not).
 | ||
| 
 | ||
|    Here are some jump tests that take an input, then output 0 if the input was
 | ||
|    zero or 1 if the input was non-zero:
 | ||
| 
 | ||
|      • 3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9 (using position mode)
 | ||
|      • 3,3,1105,-1,9,1101,0,0,12,4,12,99,1 (using immediate mode)
 | ||
| 
 | ||
|    Here's a larger example:
 | ||
| 
 | ||
|  3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,
 | ||
|  1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,
 | ||
|  999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99
 | ||
| 
 | ||
|    The above example program uses an input instruction to ask for a single
 | ||
|    number. The program will then output 999 if the input value is below 8,
 | ||
|    output 1000 if the input value is equal to 8, or output 1001 if the input
 | ||
|    value is greater than 8.
 | ||
| 
 | ||
|    This time, when the TEST diagnostic program runs its input instruction to
 | ||
|    get the ID of the system to test, provide it 5, the ID for the ship's
 | ||
|    thermal radiator controller. This diagnostic test suite only outputs one
 | ||
|    number, the diagnostic code.
 | ||
| 
 | ||
|    What is the diagnostic code for system ID 5?
 | ||
| 
 | ||
|    Your puzzle answer was 9386583.
 | ||
| 
 | ||
|    Both parts of this puzzle are complete! They provide two gold stars: **
 | ||
| 
 | ||
|    At this point, you should return to your Advent calendar and try another
 | ||
|    puzzle.
 | ||
| 
 | ||
|    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://adventofcode.com/2019/day/2 .
 | ||
|    https://en.wikipedia.org/wiki/Spacecraft_thermal_control .
 | ||
|    https://adventofcode.com/2019 . https://adventofcode.com/2019/day/5/input .
 |