In [ ]:
from queue import Queue
from threading import Thread
from collections import defaultdict
with open('day18.txt') as f:
ins = [i.split() for i in f.readlines()]
def getop(a, defdict):
try:
op = int(a)
except ValueError:
op = defdict[a]
return op
def run(snd, rcv, name):
regs = defaultdict(int)
regs['p'] = name
ip = 0
s = 0
r = 0
while ip < len(ins) and ip >= 0:
i = ins[ip]
print(name, ip, i)
print(name, s, r)
if i[0] == 'snd':
print(name, 'snd', snd.qsize())
snd.put(getop(i[1], regs))
s += 1
elif i[0] == 'set':
regs[i[1]] = getop(i[2], regs)
elif i[0] == 'add':
regs[i[1]] += getop(i[2], regs)
elif i[0] == 'mul':
regs[i[1]] *= getop(i[2], regs)
elif i[0] == 'mod':
regs[i[1]] %= getop(i[2], regs)
elif i[0] == 'rcv':
print(name, 'rcv', rcv.qsize())
regs[i[1]] = rcv.get()
r += 1
elif i[0] == 'jgz':
if regs[i[1]] == '1':
if regs[i[1]] > 0:
ip += getop(i[2], regs)
# print(i)
continue
else:
print('???')
ip += 1
from_A = Queue()
from_B = Queue()
thread_A = Thread(target=run, args=(from_A, from_B, 0))
thread_B = Thread(target=run, args=(from_B, from_A, 1))
thread_A.start()
thread_B.start()
In [ ]: