Taddeus Kroes 7 lat temu
rodzic
commit
120c6c750d
2 zmienionych plików z 86 dodań i 0 usunięć
  1. 49 0
      19_opjumps.py
  2. 37 0
      input/19

+ 49 - 0
19_opjumps.py

@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+import sys
+
+isa = {
+    'addr': lambda a, b, reg: reg[a] + reg[b],
+    'addi': lambda a, b, reg: reg[a] + b,
+    'mulr': lambda a, b, reg: reg[a] * reg[b],
+    'muli': lambda a, b, reg: reg[a] * b,
+    'banr': lambda a, b, reg: reg[a] & reg[b],
+    'bani': lambda a, b, reg: reg[a] & b,
+    'borr': lambda a, b, reg: reg[a] | reg[b],
+    'bori': lambda a, b, reg: reg[a] | b,
+    'setr': lambda a, b, reg: reg[a],
+    'seti': lambda a, b, reg: a,
+    'gtir': lambda a, b, reg: int(a > reg[b]),
+    'gtri': lambda a, b, reg: int(reg[a] > b),
+    'gtrr': lambda a, b, reg: int(reg[a] > reg[b]),
+    'eqir': lambda a, b, reg: int(a == reg[b]),
+    'eqri': lambda a, b, reg: int(reg[a] == b),
+    'eqrr': lambda a, b, reg: int(reg[a] == reg[b]),
+}
+
+def parse_insts(f):
+    for line in f:
+        opcode, operands = line[:-1].split(' ', 1)
+        a, b, out = map(int, operands.split())
+        yield opcode, a, b, out
+
+line = sys.stdin.readline()[:-1]
+assert line.startswith('#ip ')
+ip = int(line[4:])
+program = list(parse_insts(sys.stdin))
+
+# part 1
+reg = [0, 0, 0, 0, 0, 0]
+
+while reg[ip] < len(program):
+    opcode, a, b, out = program[reg[ip]]
+    reg[out] = isa[opcode](a, b, reg)
+    reg[ip] += 1
+
+print(reg[0])
+
+# part 2
+def simulate(reg5):
+    return sum(0 if reg5 % reg1 else reg1 for reg1 in range(1, reg5 + 1))
+
+assert simulate(864) == reg[0]
+print(simulate(10551264))

+ 37 - 0
input/19

@@ -0,0 +1,37 @@
+#ip 4
+addi 4 16 4
+seti 1 1 1
+seti 1 7 3
+mulr 1 3 2
+eqrr 2 5 2
+addr 2 4 4
+addi 4 1 4
+addr 1 0 0
+addi 3 1 3
+gtrr 3 5 2
+addr 4 2 4
+seti 2 3 4
+addi 1 1 1
+gtrr 1 5 2
+addr 2 4 4
+seti 1 6 4
+mulr 4 4 4
+addi 5 2 5
+mulr 5 5 5
+mulr 4 5 5
+muli 5 11 5
+addi 2 1 2
+mulr 2 4 2
+addi 2 6 2
+addr 5 2 5
+addr 4 0 4
+seti 0 0 4
+setr 4 5 2
+mulr 2 4 2
+addr 4 2 2
+mulr 4 2 2
+muli 2 14 2
+mulr 2 4 2
+addr 5 2 5
+seti 0 5 0
+seti 0 2 4