This commit is contained in:
dave 2018-12-21 19:09:16 -05:00
parent d93c9cfed6
commit 4ed2e4cb41
4 changed files with 242 additions and 0 deletions

154
19/a.py Executable file
View File

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

14
19/b.py Executable file
View File

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

37
19/b_helper.py Executable file
View File

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

37
19/input.txt Normal file
View File

@ -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