169 lines
7.2 KiB
Plaintext
169 lines
7.2 KiB
Plaintext
|
Advent of Code
|
|||
|
|
|||
|
--- Day 17: Chronospatial Computer ---
|
|||
|
|
|||
|
The Historians push the button on their strange device, but this time, you
|
|||
|
all just feel like you're [16]falling.
|
|||
|
|
|||
|
"Situation critical", the device announces in a familiar voice.
|
|||
|
"Bootstrapping process failed. Initializing debugger...."
|
|||
|
|
|||
|
The small handheld device suddenly unfolds into an entire computer! The
|
|||
|
Historians look around nervously before one of them tosses it to you.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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:
|
|||
|
|
|||
|
• Combo operands 0 through 3 represent literal values 0 through 3.
|
|||
|
• Combo operand 4 represents the value of register A.
|
|||
|
• Combo operand 5 represents the value of register B.
|
|||
|
• Combo operand 6 represents the value of register C.
|
|||
|
• Combo operand 7 is reserved and will not appear in valid programs.
|
|||
|
|
|||
|
The eight instructions are as follows:
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
The bxl instruction (opcode 1) calculates the [17]bitwise XOR of register
|
|||
|
B and the instruction's literal operand, then stores the result in
|
|||
|
register B.
|
|||
|
|
|||
|
The bst instruction (opcode 2) calculates the value of its combo operand
|
|||
|
[18]modulo 8 (thereby keeping only its lowest 3 bits), then writes that
|
|||
|
value to the B register.
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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.)
|
|||
|
|
|||
|
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.)
|
|||
|
|
|||
|
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.)
|
|||
|
|
|||
|
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.)
|
|||
|
|
|||
|
Here are some examples of instruction operation:
|
|||
|
|
|||
|
• If register C contains 9, the program 2,6 would set register B to 1.
|
|||
|
• If register A contains 10, the program 5,0,5,1,5,4 would output 0,1,2.
|
|||
|
• 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.
|
|||
|
• If register B contains 29, the program 1,7 would set register B to 26.
|
|||
|
• If register B contains 2024 and register C contains 43690, the program
|
|||
|
4,0 would set register B to 44354.
|
|||
|
|
|||
|
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:
|
|||
|
|
|||
|
Register A: 729
|
|||
|
Register B: 0
|
|||
|
Register C: 0
|
|||
|
|
|||
|
Program: 0,1,5,4,3,0
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
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?
|
|||
|
|
|||
|
Your puzzle answer was 2,7,6,5,6,0,2,3,1.
|
|||
|
|
|||
|
--- Part Two ---
|
|||
|
|
|||
|
Digging deeper in the device's manual, you discover the problem: this
|
|||
|
program is supposed to output another copy of the program! Unfortunately,
|
|||
|
the value in register A seems to have been corrupted. You'll need to find
|
|||
|
a new value to which you can initialize register A so that the program's
|
|||
|
output instructions produce an exact copy of the program itself.
|
|||
|
|
|||
|
For example:
|
|||
|
|
|||
|
Register A: 2024
|
|||
|
Register B: 0
|
|||
|
Register C: 0
|
|||
|
|
|||
|
Program: 0,3,5,4,3,0
|
|||
|
|
|||
|
This program outputs a copy of itself if register A is instead initialized
|
|||
|
to 117440. (The original initial value of register A, 2024, is ignored.)
|
|||
|
|
|||
|
What is the lowest positive initial value for register A that causes the
|
|||
|
program to output a copy of itself?
|
|||
|
|
|||
|
Your puzzle answer was 107416870455451.
|
|||
|
|
|||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
|||
|
|
|||
|
At this point, you should [19]return to your Advent calendar and try
|
|||
|
another puzzle.
|
|||
|
|
|||
|
If you still want to see it, you can [20]get your puzzle input.
|
|||
|
|
|||
|
References
|
|||
|
|
|||
|
Visible links
|
|||
|
1. https://adventofcode.com/
|
|||
|
2. https://adventofcode.com/2024/about
|
|||
|
3. https://adventofcode.com/2024/events
|
|||
|
4. https://cottonbureau.com/people/advent-of-code
|
|||
|
5. https://adventofcode.com/2024/settings
|
|||
|
6. https://adventofcode.com/2024/auth/logout
|
|||
|
7. Advent of Code Supporter
|
|||
|
https://adventofcode.com/2024/support
|
|||
|
8. https://adventofcode.com/2024
|
|||
|
9. https://adventofcode.com/2024
|
|||
|
10. https://adventofcode.com/2024/support
|
|||
|
11. https://adventofcode.com/2024/sponsors
|
|||
|
12. https://adventofcode.com/2024/leaderboard
|
|||
|
13. https://adventofcode.com/2024/stats
|
|||
|
16. https://adventofcode.com/2018/day/6
|
|||
|
17. https://en.wikipedia.org/wiki/Bitwise_operation#XOR
|
|||
|
18. https://en.wikipedia.org/wiki/Modulo
|
|||
|
19. https://adventofcode.com/2024
|
|||
|
20. https://adventofcode.com/2024/day/17/input
|