parent
dbdaf7ba13
commit
21635ec6b8
2 changed files with 321 additions and 0 deletions
@ -0,0 +1,69 @@ |
||||
# Code translated from https://github.com/Mahrgell/AoC2021/blob/main/aoc21-24/src/main.rs |
||||
|
||||
|
||||
def readMonad(fileName): |
||||
with open(fileName) as file: |
||||
lines = file.read().splitlines() |
||||
instructions: list[tuple[str, tuple[str, ...]]] = [] |
||||
for line in lines: |
||||
instrValues = tuple(line.split(" ")) |
||||
append = (instrValues[0], instrValues[1:]) |
||||
instructions.append(append) |
||||
return instructions |
||||
|
||||
|
||||
fieldToPos = { |
||||
'x': 0, |
||||
'y': 1, |
||||
'z': 2, |
||||
'w': 3 |
||||
} |
||||
|
||||
calc = { |
||||
'add': lambda a, b: a + b, |
||||
'mul': lambda a, b: a * b, |
||||
'div': lambda a, b: a // b, |
||||
'mod': lambda a, b: a % b, |
||||
'eql': lambda a, b: 1 if a == b else 0 |
||||
} |
||||
|
||||
|
||||
def find(): |
||||
instructions = readMonad("input") |
||||
states: list[tuple[list[int], tuple[int, int]]] = [([0, 0, 0, 0], (0, 0))] |
||||
i = 1 |
||||
for cmd, values in instructions: |
||||
if cmd == "inp": |
||||
newStates = [] |
||||
knownAluIndices = {} |
||||
field = values[0] |
||||
for alu, (minV, maxV) in states: |
||||
for v in range(1, 10): |
||||
newAlu = alu.copy() |
||||
newAlu[fieldToPos[field]] = v |
||||
minV, maxV = minV * 10 + v, maxV * 10 + v |
||||
if index := knownAluIndices.get(tuple(newAlu)): |
||||
alu, (newMin, newMax) = newStates[index] |
||||
newMin = min(newMin, minV) |
||||
newMax = max(newMax, maxV) |
||||
newStates[index] = alu, (newMin, newMax) |
||||
else: |
||||
knownAluIndices[tuple(newAlu)] = len(newStates) |
||||
newStates.append((newAlu, (minV, maxV))) |
||||
states = newStates |
||||
print(f"{i} Processing {len(states)} states") |
||||
i += 1 |
||||
else: |
||||
for alu, _ in states: |
||||
field1, field2 = values |
||||
v2 = int(field2) if field2.lstrip("-").isnumeric() else alu[fieldToPos[field2]] |
||||
pos1 = fieldToPos[field1] |
||||
alu[pos1] = calc[cmd](alu[pos1], v2) |
||||
|
||||
valid = {minmax for alu, minmax in states if alu[3] == 0} |
||||
lowest = min(m for m, _ in valid) |
||||
highest = max(m for _, m in valid) |
||||
print(lowest, highest) |
||||
|
||||
|
||||
find() |
@ -0,0 +1,252 @@ |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 11 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 16 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 12 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 11 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 13 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 12 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -5 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 12 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -3 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 12 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 14 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 2 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 15 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 11 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -16 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 4 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 14 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 12 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 1 |
||||
add x 15 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 9 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -7 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 10 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -11 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 11 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -6 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 6 |
||||
mul y x |
||||
add z y |
||||
inp w |
||||
mul x 0 |
||||
add x z |
||||
mod x 26 |
||||
div z 26 |
||||
add x -11 |
||||
eql x w |
||||
eql x 0 |
||||
mul y 0 |
||||
add y 25 |
||||
mul y x |
||||
add y 1 |
||||
mul z y |
||||
mul y 0 |
||||
add y w |
||||
add y 15 |
||||
mul y x |
||||
add z y |
Loading…
Reference in new issue