As you see the Elves defend their hot chocolate successfully, you go back to falling through time. This is going to become a problem. If you're ever going to return to your own time, you need to understand how this device on your wrist works. You have a little while before you reach your next destination, and with a bit of trial and error, you manage to pull up a programming manual on the device's tiny screen. According to the manual, the device has four [registers](https://en.wikipedia.org/wiki/Hardware_register) (numbered `0` through `3`) that can be manipulated by [instructions](https://en.wikipedia.org/wiki/Instruction_set_architecture#Instructions) containing one of 16 opcodes. The registers start with the value `0`. Every instruction consists of four values: an *opcode*, two *inputs* (named `A` and `B`), and an *output* (named `C`), in that order. The opcode specifies the behavior of the instruction and how the inputs are interpreted. The output, `C`, is always treated as a register. In the opcode descriptions below, if something says "*value `A`*", it means to take the number given as `A` *literally*. (This is also called an "immediate" value.) If something says "*register `A`*", it means to use the number given as `A` to read from (or write to) the *register with that number*. So, if the opcode `addi` adds register `A` and value `B`, storing the result in register `C`, and the instruction `addi 0 7 3` is encountered, it would add `7` to the value contained by register `0` and store the sum in register `3`, never modifying registers `0`, `1`, or `2` in the process. Many opcodes are similar except for how they interpret their arguments. The opcodes fall into seven general categories: Addition: * `addr` (add register) stores into register `C` the result of adding register `A` and register `B`. * `addi` (add immediate) stores into register `C` the result of adding register `A` and value `B`. Multiplication: * `mulr` (multiply register) stores into register `C` the result of multiplying register `A` and register `B`. * `muli` (multiply immediate) stores into register `C` the result of multiplying register `A` and value `B`. [Bitwise AND](https://en.wikipedia.org/wiki/Bitwise_AND): * `banr` (bitwise AND register) stores into register `C` the result of the bitwise AND of register `A` and register `B`. * `bani` (bitwise AND immediate) stores into register `C` the result of the bitwise AND of register `A` and value `B`. [Bitwise OR](https://en.wikipedia.org/wiki/Bitwise_OR): * `borr` (bitwise OR register) stores into register `C` the result of the bitwise OR of register `A` and register `B`. * `bori` (bitwise OR immediate) stores into register `C` the result of the bitwise OR of register `A` and value `B`. Assignment: * `setr` (set register) copies the contents of register `A` into register `C`. (Input `B` is ignored.) * `seti` (set immediate) stores value `A` into register `C`. (Input `B` is ignored.) Greater-than testing: * `gtir` (greater-than immediate/register) sets register `C` to `1` if value `A` is greater than register `B`. Otherwise, register `C` is set to `0`. * `gtri` (greater-than register/immediate) sets register `C` to `1` if register `A` is greater than value `B`. Otherwise, register `C` is set to `0`. * `gtrr` (greater-than register/register) sets register `C` to `1` if register `A` is greater than register `B`. Otherwise, register `C` is set to `0`. Equality testing: * `eqir` (equal immediate/register) sets register `C` to `1` if value `A` is equal to register `B`. Otherwise, register `C` is set to `0`. * `eqri` (equal register/immediate) sets register `C` to `1` if register `A` is equal to value `B`. Otherwise, register `C` is set to `0`. * `eqrr` (equal register/register) sets register `C` to `1` if register `A` is equal to register `B`. Otherwise, register `C` is set to `0`. Unfortunately, while the manual gives the *name* of each opcode, it doesn't seem to indicate the *number*. However, you can monitor the CPU to see the contents of the registers before and after instructions are executed to try to work them out. Each opcode has a number from `0` through `15`, but the manual doesn't say which is which. For example, suppose you capture the following sample: ``` Before: [3, 2, 1, 1] 9 2 1 2 After: [3, 2, 2, 1] ``` This sample shows the effect of the instruction `9 2 1 2` on the registers. Before the instruction is executed, register `0` has value `3`, register `1` has value `2`, and registers `2` and `3` have value `1`. After the instruction is executed, register `2`'s value becomes `2`. The instruction itself, `9 2 1 2`, means that opcode `9` was executed with `A=2`, `B=1`, and `C=2`. Opcode `9` could be any of the 16 opcodes listed above, but only three of them behave in a way that would cause the result shown in the sample: * Opcode `9` could be `mulr`: register `2` (which has a value of `1`) times register `1` (which has a value of `2`) produces `2`, which matches the value stored in the output register, register `2`. * Opcode `9` could be `addi`: register `2` (which has a value of `1`) plus value `1` produces `2`, which matches the value stored in the output register, register `2`. * Opcode `9` could be `seti`: value `2` matches the value stored in the output register, register `2`; the number given for `B` is irrelevant. None of the other opcodes produce the result captured in the sample. Because of this, the sample above *behaves like three opcodes*. You collect many of these samples (the first section of your puzzle input). The manual also includes a small test program (the second section of your puzzle input) - you can *ignore it for now*. Ignoring the opcode numbers, *how many samples in your puzzle input behave like three or more opcodes?* Your puzzle answer was `588`. \--- Part Two --- ---------- Using the samples you collected, work out the number of each opcode and execute the test program (the second section of your puzzle input). *What value is contained in register `0` after executing the test program?* Your puzzle answer was `627`. Both parts of this puzzle are complete! They provide two gold stars: \*\* At this point, you should [return to your Advent calendar](/2018) and try another puzzle. If you still want to see it, you can [get your puzzle input](16/input).