1
0
Fork 0

2017 day 18

This commit is contained in:
Lucidiot 2020-12-07 02:42:52 +01:00
parent b8ffad6c79
commit 96178dfda0
Signed by: lucidiot
GPG Key ID: 3358C1CA6906FB8D
1 changed files with 52 additions and 0 deletions

52
2017/18/duet.py Executable file
View File

@ -0,0 +1,52 @@
#!/usr/bin/env python3
import sys
from multiprocessing import Queue
from multiprocessing.pool import ThreadPool
from collections import defaultdict
data = [l.strip().split(" ") for l in sys.stdin.readlines()]
def run(ident, rcvqueue, sndqueue):
reg = defaultdict(int)
reg['p'] = ident
pos, times_sent, played = 0, 0, None
def parse(word):
try:
return int(word)
except ValueError:
return reg[word]
while 0 <= pos < len(data) - 1:
ins = data[pos]
if ins[0] == 'snd':
played = parse(ins[1])
if sndqueue:
sndqueue.put(parse(ins[1]))
times_sent += 1
print(times_sent)
elif ins[0] == 'set':
reg[ins[1]] = parse(ins[2])
elif ins[0] == 'add':
reg[ins[1]] += parse(ins[2])
elif ins[0] == 'mul':
reg[ins[1]] *= parse(ins[2])
elif ins[0] == 'mod':
reg[ins[1]] %= parse(ins[2])
elif ins[0] == 'rcv':
if rcvqueue:
reg[ins[1]] = rcvqueue.get()
elif parse(ins[1]) > 0:
return played
elif ins[0] == 'jgz':
pos += parse(ins[2])
continue
pos += 1
return times_sent
print('Part 1:', run(0, None, None))
pool = ThreadPool(processes=2)
q1, q2 = Queue(), Queue()
p1, p2 = pool.apply_async(run, (0, q1, q2)), pool.apply_async(run, (0, q2, q1))
p1.get()
print('Part 2:', p2.get())