day 19
This commit is contained in:
parent
d93c9cfed6
commit
4ed2e4cb41
|
@ -0,0 +1,154 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
def addr(regs, a, b, c):
|
||||||
|
# addr (add register) stores into register C the result of adding register A and register B.
|
||||||
|
regs.set(c, regs.get(a) + regs.get(b))
|
||||||
|
|
||||||
|
|
||||||
|
def addi(regs, a, b, c):
|
||||||
|
# addi (add immediate) stores into register C the result of adding register A and value B.
|
||||||
|
regs.set(c, regs.get(a) + b)
|
||||||
|
|
||||||
|
|
||||||
|
def mulr(regs, a, b, c):
|
||||||
|
# mulr (multiply register) stores into register C the result of multiplying register A and register B.
|
||||||
|
regs.set(c, regs.get(a) * regs.get(b))
|
||||||
|
|
||||||
|
|
||||||
|
def muli(regs, a, b, c):
|
||||||
|
# muli (multiply immediate) stores into register C the result of multiplying register A and value B.
|
||||||
|
regs.set(c, regs.get(a) * b)
|
||||||
|
|
||||||
|
|
||||||
|
def banr(regs, a, b, c):
|
||||||
|
# banr (bitwise AND register) stores into register C the result of the bitwise AND of register A and register B.
|
||||||
|
regs.set(c, regs.get(a) & regs.get(b))
|
||||||
|
|
||||||
|
|
||||||
|
def bani(regs, a, b, c):
|
||||||
|
# bani (bitwise AND immediate) stores into register C the result of the bitwise AND of register A and value B.
|
||||||
|
regs.set(c, regs.get(a) & b)
|
||||||
|
|
||||||
|
|
||||||
|
def borr(regs, a, b, c):
|
||||||
|
# borr (bitwise OR register) stores into register C the result of the bitwise OR of register A and register B.
|
||||||
|
regs.set(c, regs.get(a) | regs.get(b))
|
||||||
|
|
||||||
|
|
||||||
|
def bori(regs, a, b, c):
|
||||||
|
# bori (bitwise OR immediate) stores into register C the result of the bitwise OR of register A and value B.
|
||||||
|
regs.set(c, regs.get(a) | b)
|
||||||
|
|
||||||
|
|
||||||
|
def setr(regs, a, b, c):
|
||||||
|
# setr (set register) copies the contents of register A into register C. (Input B is ignored.)
|
||||||
|
regs.set(c, regs.get(a))
|
||||||
|
|
||||||
|
|
||||||
|
def seti(regs, a, b, c):
|
||||||
|
# seti (set immediate) stores value A into register C. (Input B is ignored.)
|
||||||
|
regs.set(c, a)
|
||||||
|
|
||||||
|
|
||||||
|
def gtir(regs, a, b, c):
|
||||||
|
# gtir (greater-than immediate/register) sets register C to 1 if value A is greater than register B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if a > regs.get(b) else 0)
|
||||||
|
|
||||||
|
|
||||||
|
def gtri(regs, a, b, c):
|
||||||
|
# gtri (greater-than register/immediate) sets register C to 1 if register A is greater than value B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if regs.get(a) > b else 0)
|
||||||
|
|
||||||
|
|
||||||
|
def gtrr(regs, a, b, c):
|
||||||
|
# gtrr (greater-than register/register) sets register C to 1 if register A is greater than register B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if regs.get(a) > regs.get(b) else 0)
|
||||||
|
|
||||||
|
|
||||||
|
def eqir(regs, a, b, c):
|
||||||
|
# eqir (equal immediate/register) sets register C to 1 if value A is equal to register B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if a == regs.get(b) else 0)
|
||||||
|
|
||||||
|
|
||||||
|
def eqri(regs, a, b, c):
|
||||||
|
# eqri (equal register/immediate) sets register C to 1 if register A is equal to value B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if regs.get(a) == b else 0)
|
||||||
|
|
||||||
|
|
||||||
|
def eqrr(regs, a, b, c):
|
||||||
|
# eqrr (equal register/register) sets register C to 1 if register A is equal to register B.
|
||||||
|
# Otherwise, register C is set to 0.
|
||||||
|
regs.set(c, 1 if regs.get(a) == regs.get(b) else 0)
|
||||||
|
|
||||||
|
|
||||||
|
opsfuncs = (addr,
|
||||||
|
addi,
|
||||||
|
mulr,
|
||||||
|
muli,
|
||||||
|
banr,
|
||||||
|
bani,
|
||||||
|
borr,
|
||||||
|
bori,
|
||||||
|
setr,
|
||||||
|
seti,
|
||||||
|
gtir,
|
||||||
|
gtri,
|
||||||
|
gtrr,
|
||||||
|
eqir,
|
||||||
|
eqri,
|
||||||
|
eqrr)
|
||||||
|
|
||||||
|
|
||||||
|
ops = {op.__name__: op for op in opsfuncs}
|
||||||
|
|
||||||
|
|
||||||
|
class Cpu(object):
|
||||||
|
def __init__(self, initial=None):
|
||||||
|
self.ipreg = None
|
||||||
|
self.regs = list(initial) if initial else [0] * 6
|
||||||
|
|
||||||
|
def get(self, num):
|
||||||
|
return self.regs[num]
|
||||||
|
|
||||||
|
def set(self, num, value):
|
||||||
|
self.regs[num] = value
|
||||||
|
|
||||||
|
def execute(self, instr, params):
|
||||||
|
"""
|
||||||
|
Execute an instruction and return the new instruction pointer value
|
||||||
|
"""
|
||||||
|
self.regs[self.ipreg] = self.ip
|
||||||
|
ops[instr](self, *params)
|
||||||
|
return self.regs[self.ipreg]
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
setip = None
|
||||||
|
program = []
|
||||||
|
with open("input.txt") as f:
|
||||||
|
setip = int(f.readline().strip().split()[-1])
|
||||||
|
for line in f.readlines():
|
||||||
|
instr, *params = line.strip().split()
|
||||||
|
program.append([instr] + [int(p) for p in params])
|
||||||
|
|
||||||
|
cpu = Cpu()
|
||||||
|
cpu.ipreg = setip
|
||||||
|
|
||||||
|
ip = 0
|
||||||
|
while ip < len(program):
|
||||||
|
instr = program[ip]
|
||||||
|
cpu.ip = ip
|
||||||
|
ip = cpu.execute(instr[0], instr[1:])
|
||||||
|
ip += 1
|
||||||
|
|
||||||
|
print(cpu.regs[0])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
number = 10551276 # from r5 in b_helper.py
|
||||||
|
ssum = 0
|
||||||
|
for i in range(1, 10551276 + 1):
|
||||||
|
if number % i == 0:
|
||||||
|
ssum += i
|
||||||
|
|
||||||
|
print(ssum)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,37 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
|
||||||
|
from a import Cpu
|
||||||
|
import pdb
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
setip = None
|
||||||
|
program = []
|
||||||
|
with open("input.txt") as f:
|
||||||
|
setip = int(f.readline().strip().split()[-1])
|
||||||
|
for line in f.readlines():
|
||||||
|
instr, *params = line.strip().split()
|
||||||
|
program.append([instr] + [int(p) for p in params])
|
||||||
|
|
||||||
|
cpu = Cpu([1, 0, 0, 0, 0, 0])
|
||||||
|
cpu.ipreg = setip
|
||||||
|
|
||||||
|
ip = 0
|
||||||
|
cycles = 0
|
||||||
|
while ip < len(program):
|
||||||
|
instr = program[ip]
|
||||||
|
# if cycles % 1000 == 0:
|
||||||
|
cpu.ip = ip
|
||||||
|
ip = cpu.execute(instr[0], instr[1:])
|
||||||
|
ip += 1
|
||||||
|
cycles += 1
|
||||||
|
|
||||||
|
print("IP={:<2}, INSTR={:<18}, REGS={}".format(ip, str(instr), cpu.regs))
|
||||||
|
|
||||||
|
if cpu.regs[setip] == 10:
|
||||||
|
pdb.set_trace()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,37 @@
|
||||||
|
#ip 4
|
||||||
|
addi 4 16 4
|
||||||
|
seti 1 5 1
|
||||||
|
seti 1 2 2
|
||||||
|
mulr 1 2 3
|
||||||
|
eqrr 3 5 3
|
||||||
|
addr 3 4 4
|
||||||
|
addi 4 1 4
|
||||||
|
addr 1 0 0
|
||||||
|
addi 2 1 2
|
||||||
|
gtri 2 5 3
|
||||||
|
addr 4 3 4
|
||||||
|
seti 2 7 4
|
||||||
|
addi 1 1 1
|
||||||
|
gtrr 1 5 3
|
||||||
|
addr 3 4 4
|
||||||
|
seti 1 9 4
|
||||||
|
mulr 4 4 4
|
||||||
|
addi 5 2 5
|
||||||
|
mulr 5 5 5
|
||||||
|
mulr 4 5 5
|
||||||
|
muli 5 11 5
|
||||||
|
addi 3 1 3
|
||||||
|
mulr 3 4 3
|
||||||
|
addi 3 18 3
|
||||||
|
addr 5 3 5
|
||||||
|
addr 4 0 4
|
||||||
|
seti 0 3 4
|
||||||
|
setr 4 2 3
|
||||||
|
mulr 3 4 3
|
||||||
|
addr 4 3 3
|
||||||
|
mulr 4 3 3
|
||||||
|
muli 3 14 3
|
||||||
|
mulr 3 4 3
|
||||||
|
addr 5 3 5
|
||||||
|
seti 0 4 0
|
||||||
|
seti 0 5 4
|
Loading…
Reference in New Issue