Day 24: Arithmetic Logic Unit
text = File.read!("input/2022/24.txt")
Arithmetic Logic Unit
<a href=”https://en.wikipedia.org/wiki/Magic_smoke” target=”_blank”>Magic smoke</a> starts leaking from the submarine’s arithmetic logic unit (ALU). Without the ability to perform basic arithmetic and logic functions, the submarine can’t produce cool patterns with its Christmas lights!
It also can’t navigate. Or run the oxygen system.
Don’t worry, though - you probably have enough oxygen left to give you enough time to build a new ALU.
The ALU is a four-dimensional processing unit: it has integer variables
w, x, y, and z. These variables all start with the value 0.
The ALU also supports six instructions:
-
inp a- Read an input value and write it to variablea. -
add a b- Add the value ofato the value ofb, then store the result in variablea. -
mul a b- Multiply the value ofaby the value ofb, then store the result in variablea. -
div a b- Divide the value ofaby the value ofb, truncate the result to an integer, then store the result in variablea. (Here, “truncate” means to round the value toward zero.) -
mod a b- Divide the value ofaby the value ofb, then store the remainder in variablea. (This is also called the <a href=”https://en.wikipedia.org/wiki/Modulo_operation” target=”_blank”>modulo</a> operation.) -
eql a b- If the value ofaandbare equal, then store the value1in variablea. Otherwise, store the value0in variablea.
In all of these instructions, a and b are placeholders; a will
always be the variable where the result of the operation is stored (one
of w, x, y, or z), while b can be either a variable or a
number. Numbers can be positive or negative, but will always be
integers.
The ALU has no jump instructions; in an ALU program, every instruction is run exactly once in order from top to bottom. The program halts after the last instruction has finished executing.
(Program authors should be especially cautious; attempting to execute
div with b=0 or attempting to execute mod with a<0 or b<=0
will cause the program to crash and might even <span
title=”Maybe this is what happened to the last one.”>damage the
ALU</span>. These operations are never intended in any serious ALU
program.)
For example, here is an ALU program which takes an input number, negates
it, and stores it in x:
inp x
mul x -1
Here is an ALU program which takes two input numbers, then sets z to
1 if the second input number is three times larger than the first
input number, or sets z to 0 otherwise:
inp z
inp x
mul z 3
eql z x
Here is an ALU program which takes a non-negative integer as input,
converts it into binary, and stores the lowest (1’s) bit in z, the
second-lowest (2’s) bit in y, the third-lowest (4’s) bit in x, and
the fourth-lowest (8’s) bit in w:
inp w
add z w
mod z 2
div w 2
add y w
mod y 2
div w 2
add x w
mod x 2
div w 2
mod w 2
Once you have built a replacement ALU, you can install it in the submarine, which will immediately resume what it was doing when the ALU failed: validating the submarine’s model number. To do this, the ALU will run the MOdel Number Automatic Detector program (MONAD, your puzzle input).
Submarine model numbers are always fourteen-digit numbers consisting
only of digits 1 through 9. The digit 0 cannot appear in a model
number.
When MONAD checks a hypothetical fourteen-digit model number, it uses
fourteen separate inp instructions, each expecting a single digit of
the model number in order of most to least significant. (So, to check
the model number 13579246899999, you would give 1 to the first inp
instruction, 3 to the second inp instruction, 5 to the third inp
instruction, and so on.) This means that when operating MONAD, each
input instruction should only ever be given an integer value of at least
1 and at most 9.
Then, after MONAD has finished running all of its instructions, it will
indicate that the model number was valid by leaving a 0 in variable
z. However, if the model number was invalid, it will leave some
other non-zero value in z.
MONAD imposes additional, mysterious restrictions on model numbers, and legend says the last copy of the MONAD documentation was eaten by a <a href=”https://en.wikipedia.org/wiki/Japanese_raccoon_dog” target=”_blank”>tanuki</a>. You’ll need to figure out what MONAD does some other way.
To enable as many submarine features as possible, find the largest valid
fourteen-digit model number that contains no 0 digits. What is the
largest model number accepted by MONAD?
Your puzzle answer was 12996997829399.
Part Two
As the submarine starts booting up things like the <a href=”https://www.youtube.com/watch?v=RXJKdh1KZ0w” target=”_blank”>Retro Encabulator</a>, you realize that maybe you don’t need all these submarine features after all.
What is the smallest model number accepted by MONAD?
Your puzzle answer was 11841231117189.