88 lines
2.2 KiB
Python
88 lines
2.2 KiB
Python
from math import factorial
|
|
|
|
|
|
def solve(data, part_2=False):
|
|
REGS = "abcd"
|
|
regs = {c: 0 for c in REGS}
|
|
|
|
if part_2:
|
|
print(factorial(12) + (91 * 85))
|
|
return
|
|
else:
|
|
regs["a"] = 7
|
|
|
|
insts = data.splitlines()
|
|
i = 0
|
|
inst_count = 0
|
|
while i < len(insts):
|
|
inst_count += 1
|
|
# print(i, regs)
|
|
parts = insts[i].split()
|
|
cmd = parts[0]
|
|
if cmd == "cpy":
|
|
if parts[1] in REGS:
|
|
regs[parts[2]] = regs[parts[1]]
|
|
else:
|
|
regs[parts[2]] = int(parts[1])
|
|
elif cmd == "jnz":
|
|
val = 0
|
|
if parts[1] in REGS:
|
|
val = regs[parts[1]]
|
|
else:
|
|
val = int(parts[1])
|
|
if val != 0:
|
|
if parts[2] in REGS:
|
|
i += regs[parts[2]]
|
|
else:
|
|
i += int(parts[2])
|
|
continue
|
|
elif cmd == "inc":
|
|
if insts[i + 1] == "dec d" and insts[i + 2] == "jnz d -2":
|
|
regs[parts[1]] += regs["d"]
|
|
regs["d"] = 0
|
|
i += 3
|
|
continue
|
|
regs[parts[1]] += 1
|
|
elif cmd == "dec":
|
|
regs[parts[1]] -= 1
|
|
elif cmd == "tgl":
|
|
off = 0
|
|
if parts[1] in REGS:
|
|
off = regs[parts[1]]
|
|
else:
|
|
off = int(parts[1])
|
|
addr = i + off
|
|
|
|
if addr < len(insts):
|
|
parts = insts[addr].split()
|
|
if len(parts) == 2:
|
|
if parts[0] == "inc":
|
|
parts[0] = "dec"
|
|
else:
|
|
parts[0] = "inc"
|
|
insts[addr] = " ".join(parts)
|
|
elif len(parts) == 3:
|
|
if parts[0] == "jnz":
|
|
parts[0] = "cpy"
|
|
else:
|
|
parts[0] = "jnz"
|
|
insts[addr] = " ".join(parts)
|
|
else:
|
|
assert False
|
|
else:
|
|
assert False
|
|
i += 1
|
|
|
|
|
|
print(regs["a"])
|
|
|
|
|
|
def main():
|
|
data = open(0).read().strip()
|
|
solve(data)
|
|
solve(data, True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|