Finish 2016.
This commit is contained in:
87
2016/d23.py
Normal file
87
2016/d23.py
Normal file
@@ -0,0 +1,87 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user