summaryrefslogtreecommitdiff
path: root/2024/17/python/main.py
diff options
context:
space:
mode:
Diffstat (limited to '2024/17/python/main.py')
-rw-r--r--2024/17/python/main.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/2024/17/python/main.py b/2024/17/python/main.py
new file mode 100644
index 0000000..7e8ecb1
--- /dev/null
+++ b/2024/17/python/main.py
@@ -0,0 +1,77 @@
+from fileinput import input
+from itertools import takewhile
+
+inp = map(str.strip, input())
+regs = {r[1][0]: int(r[2]) for r in (line.split() for line in takewhile(bool, inp))}
+prog = [int(o) for o in next(inp).split()[1].split(",")]
+out = []
+
+ir = 0
+combo = {
+ 0: lambda: 0,
+ 1: lambda: 1,
+ 2: lambda: 2,
+ 3: lambda: 3,
+ 4: lambda: regs["A"],
+ 5: lambda: regs["B"],
+ 6: lambda: regs["C"],
+ 7: None,
+}
+
+
+def _adv(op):
+ regs["A"] = regs["A"] >> combo[op]()
+
+
+def _bxl(op):
+ regs["B"] ^= op
+
+
+def _bst(op):
+ regs["B"] = combo[op]() & 0b111
+
+
+def _jnz(op):
+ global ir
+ if regs["A"]:
+ ir = op
+ ir -= 2 # Undo IR
+
+
+def _bxc(_):
+ regs["B"] ^= regs["C"]
+
+
+def _out(op):
+ out.append(combo[op]() & 0b111)
+
+
+def _bdv(op):
+ regs["B"] = regs["A"] >> combo[op]()
+
+
+def _cdv(op):
+ regs["C"] = regs["A"] >> combo[op]()
+
+
+instrs = {
+ 0: _adv,
+ 1: _bxl,
+ 2: _bst,
+ 3: _jnz,
+ 4: _bxc,
+ 5: _out,
+ 6: _bdv,
+ 7: _cdv,
+}
+
+while ir <= len(prog) - 1:
+ inst, op = prog[ir], prog[ir + 1]
+ instrs[inst](op)
+ ir += 2
+
+silver = ",".join(map(str, out))
+gold = 0
+
+print("silver:", silver)
+print("gold:", gold)