Taddeus Kroes 7 gadi atpakaļ
vecāks
revīzija
ae18066703
2 mainītis faili ar 117 papildinājumiem un 0 dzēšanām
  1. 85 0
      21_underflow.py
  2. 32 0
      input/21

+ 85 - 0
21_underflow.py

@@ -0,0 +1,85 @@
+#!/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
+
+def run():
+    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
+
+        if reg[ip] == 28:
+            yield reg[4]
+        elif reg[ip] == 17:
+            reg[3] //= 256
+            reg[ip] = 8
+
+def simulate():
+    r0 = r3 = r4 = 0
+    while True:
+        r3 = r4 | 65536
+        r4 = 4332021
+
+        while True:
+            r4 = (((r4 + (r3 & 255)) & 16777215) * 65899) & 16777215
+
+            if 256 > r3:
+                break
+
+            # program does this loop to divide r3 by 256:
+            #r2 = 0
+            #while (r2 + 1) * 256 <= r3:
+            #    r2 += 1
+            #r3 = r2
+
+            r3 //= 256
+
+        #if r4 == r0:
+        #    break
+
+        yield r4
+
+line = sys.stdin.readline()[:-1]
+ip = int(line[4:])
+program = list(parse_insts(sys.stdin))
+#numbers = run()
+numbers = simulate()
+
+# part 1
+first = next(numbers)
+print(first)
+
+# part 2
+seen = set()
+last = first
+for n in numbers:
+    if n in seen:
+        break
+    seen.add(n)
+    last = n
+print(last)

+ 32 - 0
input/21

@@ -0,0 +1,32 @@
+#ip 5
+seti 123 0 4
+bani 4 456 4
+eqri 4 72 4
+addr 4 5 5
+seti 0 0 5
+seti 0 0 4
+bori 4 65536 3
+seti 4332021 4 4
+bani 3 255 2
+addr 4 2 4
+bani 4 16777215 4
+muli 4 65899 4
+bani 4 16777215 4
+gtir 256 3 2
+addr 2 5 5
+addi 5 1 5
+seti 27 5 5
+seti 0 2 2
+addi 2 1 1
+muli 1 256 1
+gtrr 1 3 1
+addr 1 5 5
+addi 5 1 5
+seti 25 2 5
+addi 2 1 2
+seti 17 3 5
+setr 2 7 3
+seti 7 1 5
+eqrr 4 0 2
+addr 2 5 5
+seti 5 6 5