48 lines
1.2 KiB
Python
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)
|