adventofcode2019/5/5.py
2019-12-06 19:17:46 +00:00

109 lines
2.1 KiB
Python
Executable file

#!/usr/bin/env python3
import sys
startval = 1
# pass in start value
if len(sys.argv) == 2:
startval=sys.argv[1]
def r(inst, pos, mode):
if mode == 0:
return int(inst[inst[pos]])
else:
return int(inst[pos])
def w(inst, pos, v, mode):
if mode == 0:
inst[inst[pos]] = v
else:
print("broken!", inst, pos, v, mode)
def perform(inst):
pos = 0
store = startval
while 1:
incr = 4
fullopcode = inst[pos]
opcode = fullopcode % 100
mode_c = (int(fullopcode/100) % 10)
mode_b = (int(fullopcode/1000) % 10)
mode_a = (int(fullopcode/10000) % 10)
pos_c = pos+1
pos_b = pos+2
pos_a = pos+3
print("OP:", opcode, mode_c, mode_b, mode_a, pos_c, pos_b, pos_a)
# add
if opcode == 1:
val = r(inst,pos_c,mode_c) + r(inst,pos_b,mode_b)
w(inst, pos_a, val, mode_a)
# multiply
elif opcode == 2:
val = r(inst,pos_c, mode_c) * r(inst,pos_b, mode_b)
w(inst, pos_a, val, mode_a)
# input
elif opcode == 3:
w(inst, pos_c, store, mode_c)
incr = 2
# output
elif opcode == 4:
store = r(inst,pos_c, mode_c)
incr = 2
# jump-if-true
elif opcode == 5:
t = int(r(inst,pos_c, mode_c))
if t != 0:
pos = int(r(inst,pos_b, mode_b))
incr = 0
else:
incr = 3
# jump-if-false
elif opcode == 6:
t = int(r(inst,pos_c, mode_c))
if t == 0:
pos = int(r(inst,pos_b, mode_b))
incr = 0
else:
incr = 3
# less-than
elif opcode == 7:
c = int(r(inst,pos_c, mode_c))
b = int(r(inst,pos_b, mode_b))
if c < b:
w(inst, pos_a, 1, mode_a)
else:
w(inst, pos_a, 0, mode_a)
# equals
elif opcode == 8:
c = int(r(inst,pos_c, mode_c))
b = int(r(inst,pos_b, mode_b))
if c == b:
w(inst, pos_a, 1, mode_a)
else:
w(inst, pos_a, 0, mode_a)
# stop
elif opcode == 99:
break
pos += incr
return inst[0], store
for line in sys.stdin:
instructions = line.rstrip().split(',')
ints = []
for i in instructions:
ints.append(int(i))
res = perform(ints)
print(res)