AdventOfCode/Python/2018/19.py

48 lines
1.2 KiB
Python

from lib import *
input = read_input(2018, 19)
lines = input.splitlines()
opcodes = {
"addr": lambda reg, a, b: reg[a] + reg[b],
"addi": lambda reg, a, b: reg[a] + b,
"mulr": lambda reg, a, b: reg[a] * reg[b],
"muli": lambda reg, a, b: reg[a] * b,
"banr": lambda reg, a, b: reg[a] & reg[b],
"bani": lambda reg, a, b: reg[a] & b,
"borr": lambda reg, a, b: reg[a] | reg[b],
"bori": lambda reg, a, b: reg[a] | b,
"setr": lambda reg, a, b: reg[a],
"seti": lambda reg, a, b: a,
"gtir": lambda reg, a, b: a > reg[b],
"gtri": lambda reg, a, b: reg[a] > b,
"gtrr": lambda reg, a, b: reg[a] > reg[b],
"eqir": lambda reg, a, b: a == reg[b],
"eqri": lambda reg, a, b: reg[a] == b,
"eqrr": lambda reg, a, b: reg[a] == reg[b],
}
def exec_opcode(reg, op, a, b, c):
reg[c] = int(opcodes[op](reg, a, b))
ip, *instructions = lines
ip = int(ip.split()[1])
reg = [0] * 6
while reg[ip] in range(len(instructions)):
op, a, b, c = instructions[reg[ip]].split()
exec_opcode(reg, op, *map(int, [a, b, c]))
reg[ip] += 1
print(reg[0])
r1 = 2 * 2 * 19 * 11 + 2 * 22 + 12 + (27 * 28 + 29) * 30 * 14 * 32
r0 = 0
for r5 in range(1, r1 + 1):
if r1 % r5 == 0:
r0 += r5
print(r0)