Files
aocpy/2016/d23.py
2024-05-20 20:00:34 -04:00

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()