From 96178dfda01be446caf4f8c8f37d881af330c205 Mon Sep 17 00:00:00 2001 From: Lucidiot Date: Mon, 7 Dec 2020 02:42:52 +0100 Subject: [PATCH] 2017 day 18 --- 2017/18/duet.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 2017/18/duet.py diff --git a/2017/18/duet.py b/2017/18/duet.py new file mode 100755 index 0000000..fdf6df0 --- /dev/null +++ b/2017/18/duet.py @@ -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()) \ No newline at end of file