···11+import fileinput
22+from collections import deque, defaultdict
33+44+55+def duet_program(ops, regs, snd_q, rcv_q, part_1=False):
66+ pc = 0
77+ sends = 0
88+99+ while 0 <= pc < len(ops):
1010+ op, x, y = ops[pc]
1111+ y = regs[y] if y.isalpha() else int(y)
1212+1313+ if op == 'snd':
1414+ snd_q.appendleft(regs[x] if x.isalpha() else int(x))
1515+ sends += 1
1616+ elif op == 'set':
1717+ regs[x] = y
1818+ elif op == 'add':
1919+ regs[x] += y
2020+ elif op == 'mul':
2121+ regs[x] *= y
2222+ elif op == 'mod':
2323+ regs[x] %= y
2424+ elif op == 'rcv':
2525+ if part_1:
2626+ raise StopIteration
2727+ else:
2828+ if len(rcv_q) > 0:
2929+ regs[x] = rcv_q.pop()
3030+ else:
3131+ yield op, sends
3232+ continue
3333+ elif op == 'jgz':
3434+ if (regs[x] if x.isalpha() else int(x)) > 0:
3535+ pc += y
3636+ yield op, sends
3737+ continue
3838+3939+ pc += 1
4040+ yield op, sends
4141+4242+ raise StopIteration
4343+4444+4545+# Read puzzle input
4646+OPS = []
4747+4848+for line in fileinput.input():
4949+ parts = line.strip().split()
5050+ op, x = parts[:2]
5151+ y = 'foo' if len(parts) == 2 else parts[2]
5252+ OPS.append((op, x, y))
5353+5454+5555+# Part 1
5656+regs = defaultdict(int)
5757+snd_queue = deque()
5858+5959+for _ in duet_program(OPS, regs, snd_queue, deque(), part_1=True):
6060+ pass
6161+6262+print "Value of recovered frequency:", snd_queue[0]
6363+6464+6565+# Part 2
6666+regs_0 = defaultdict(int)
6767+regs_1 = defaultdict(int)
6868+regs_0['p'] = 0
6969+regs_1['p'] = 1
7070+7171+queue_0 = deque()
7272+queue_1 = deque()
7373+7474+last_op_0 = None
7575+last_op_1 = None
7676+7777+program_0 = duet_program(OPS, regs_0, queue_1, queue_0)
7878+program_1 = duet_program(OPS, regs_1, queue_0, queue_1)
7979+8080+while not (last_op_0 == last_op_1 == 'rcv' and len(queue_0) == len(queue_1) == 0):
8181+ last_op_0, _ = next(program_0)
8282+ last_op_1, sends = next(program_1)
8383+8484+print "Number of times program 1 sent a value:", sends
+41
2017/inputs/18.txt
···11+set i 31
22+set a 1
33+mul p 17
44+jgz p p
55+mul a 2
66+add i -1
77+jgz i -2
88+add a -1
99+set i 127
1010+set p 952
1111+mul p 8505
1212+mod p a
1313+mul p 129749
1414+add p 12345
1515+mod p a
1616+set b p
1717+mod b 10000
1818+snd b
1919+add i -1
2020+jgz i -9
2121+jgz a 3
2222+rcv b
2323+jgz b -1
2424+set f 0
2525+set i 126
2626+rcv a
2727+rcv b
2828+set p a
2929+mul p -1
3030+add p b
3131+jgz p 4
3232+snd a
3333+set a b
3434+jgz 1 3
3535+snd b
3636+set f 1
3737+add i -1
3838+jgz i -11
3939+snd a
4040+jgz f -16
4141+jgz a -19