From 21635ec6b8406796f0008b0e925327629a7d97e4 Mon Sep 17 00:00:00 2001 From: Benjo Date: Sat, 25 Dec 2021 11:49:56 +0100 Subject: [PATCH] day 24 --- 24/24.py | 69 +++++++++++++++ 24/input | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 24/24.py create mode 100644 24/input diff --git a/24/24.py b/24/24.py new file mode 100644 index 0000000..8270878 --- /dev/null +++ b/24/24.py @@ -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() diff --git a/24/input b/24/input new file mode 100644 index 0000000..975a1e1 --- /dev/null +++ b/24/input @@ -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