|
| 1 | +## \--- Day 17: Chronospatial Computer --- |
| 2 | + |
| 3 | +The Historians push the button on their strange device, but this time, you all just feel like you're [falling](https://adventofcode.com/2018/day/6). |
| 4 | + |
| 5 | +"Situation critical", the device announces in a familiar voice. "Bootstrapping process failed. Initializing debugger...." |
| 6 | + |
| 7 | +The small handheld device suddenly unfolds into an entire computer! The Historians look around nervously before one of them tosses it to you. |
| 8 | + |
| 9 | +This seems to be a 3-bit computer: its program is a list of 3-bit numbers (0 through 7), like `0,1,2,3`. The computer also has three _registers_ named `A`, `B`, and `C`, but these registers aren't limited to 3 bits and can instead hold any integer. |
| 10 | + |
| 11 | +The computer knows _eight instructions_, each identified by a 3-bit number (called the instruction's _opcode_). Each instruction also reads the 3-bit number after it as an input; this is called its _operand_. |
| 12 | + |
| 13 | +A number called the _instruction pointer_ identifies the position in the program from which the next opcode will be read; it starts at `0`, pointing at the first 3-bit number in the program. Except for jump instructions, the instruction pointer increases by `2` after each instruction is processed (to move past the instruction's opcode and its operand). If the computer tries to read an opcode past the end of the program, it instead _halts_. |
| 14 | + |
| 15 | +So, the program `0,1,2,3` would run the instruction whose opcode is `0` and pass it the operand `1`, then run the instruction having opcode `2` and pass it the operand `3`, then halt. |
| 16 | + |
| 17 | +There are two types of operands; each instruction specifies the type of its operand. The value of a _literal operand_ is the operand itself. For example, the value of the literal operand `7` is the number `7`. The value of a _combo operand_ can be found as follows: |
| 18 | + |
| 19 | +- Combo operands `0` through `3` represent literal values `0` through `3`. |
| 20 | +- Combo operand `4` represents the value of register `A`. |
| 21 | +- Combo operand `5` represents the value of register `B`. |
| 22 | +- Combo operand `6` represents the value of register `C`. |
| 23 | +- Combo operand `7` is reserved and will not appear in valid programs. |
| 24 | + |
| 25 | +The eight instructions are as follows: |
| 26 | + |
| 27 | +The `adv` instruction (opcode `0`) performs _division_. The numerator is the value in the `A` register. The denominator is found by raising 2 to the power of the instruction's _combo_ operand. (So, an operand of `2` would divide `A` by `4` (`2^2`); an operand of `5` would divide `A` by `2^B`.) The result of the division operation is _truncated_ to an integer and then written to the `A` register. |
| 28 | + |
| 29 | +The `bxl` instruction (opcode `1`) calculates the [bitwise XOR](https://en.wikipedia.org/wiki/Bitwise_operation#XOR) of register `B` and the instruction's _literal_ operand, then stores the result in register `B`. |
| 30 | + |
| 31 | +The `bst` instruction (opcode `2`) calculates the value of its _combo_ operand [modulo](https://en.wikipedia.org/wiki/Modulo) 8 (thereby keeping only its lowest 3 bits), then writes that value to the `B` register. |
| 32 | + |
| 33 | +The `jnz` instruction (opcode `3`) does _nothing_ if the `A` register is `0`. However, if the `A` register is _not zero_, it _jumps_ by setting the instruction pointer to the value of its _literal_ operand; if this instruction jumps, the instruction pointer is _not_ increased by `2` after this instruction. |
| 34 | + |
| 35 | +The `bxc` instruction (opcode `4`) calculates the _bitwise XOR_ of register `B` and register `C`, then stores the result in register `B`. (For legacy reasons, this instruction reads an operand but _ignores_ it.) |
| 36 | + |
| 37 | +The `out` instruction (opcode `5`) calculates the value of its _combo_ operand modulo 8, then _outputs_ that value. (If a program outputs multiple values, they are separated by commas.) |
| 38 | + |
| 39 | +The `bdv` instruction (opcode `6`) works exactly like the `adv` instruction except that the result is stored in the `B` register_. (The numerator is still read from the `A` register.) |
| 40 | + |
| 41 | +The `cdv` instruction (opcode `7`) works exactly like the `adv` instruction except that the result is stored in the `C` register_. (The numerator is still read from the `A` register.) |
| 42 | + |
| 43 | +Here are some examples of instruction operation: |
| 44 | + |
| 45 | +- If register `C` contains `9`, the program `2,6` would set register `B` to `1`. |
| 46 | +- If register `A` contains `10`, the program `5,0,5,1,5,4` would output `0,1,2`. |
| 47 | +- If register `A` contains `2024`, the program `0,1,5,4,3,0` would output `4,2,5,6,7,7,7,7,3,1,0` and leave `0` in register `A`. |
| 48 | +- If register `B` contains `29`, the program `1,7` would set register `B` to `26`. |
| 49 | +- If register `B` contains `2024` and register `C` contains `43690`, the program `4,0` would set register `B` to `44354`. |
| 50 | + |
| 51 | +The Historians' strange device has finished initializing its debugger and is displaying some _information about the program it is trying to run_ (your puzzle input). For example: |
| 52 | + |
| 53 | +``` |
| 54 | +Register A: 729 |
| 55 | +Register B: 0 |
| 56 | +Register C: 0 |
| 57 | +
|
| 58 | +Program: 0,1,5,4,3,0 |
| 59 | +``` |
| 60 | + |
| 61 | +Your first task is to _determine what the program is trying to output_. To do this, initialize the registers to the given values, then run the given program, collecting any output produced by `out` instructions. (Always join the values produced by `out` instructions with commas.) After the above program halts, its final output will be `4,6,3,5,6,3,5,2,1,0`. |
| 62 | + |
| 63 | +Using the information provided by the debugger, initialize the registers to the given values, then run the program. Once it halts, _what do you get if you use commas to join the values it output into a single string?_ |
| 64 | + |
| 65 | + |
| 66 | +Your puzzle answer was `[REDACTED]`. |
| 67 | + |
| 68 | +The first half of this puzzle is complete! It provides one gold star: ⭐ |
0 commit comments