|
|
@@ -0,0 +1,46 @@ |
|
|
|
import collections |
|
|
|
import sys |
|
|
|
import threading |
|
|
|
|
|
|
|
from intcode import compute |
|
|
|
|
|
|
|
|
|
|
|
def communicate(n): |
|
|
|
yield n |
|
|
|
while True: |
|
|
|
while queues[n]: |
|
|
|
yield queues[n].popleft() |
|
|
|
yield -1 |
|
|
|
|
|
|
|
|
|
|
|
def handle(n): |
|
|
|
bot = compute(text, communicate(n)) |
|
|
|
for addr, X, Y in zip(bot, bot, bot): |
|
|
|
if addr == 255: |
|
|
|
NAT.append((X, Y)) |
|
|
|
else: |
|
|
|
queues[addr].extend((X, Y)) |
|
|
|
|
|
|
|
|
|
|
|
text = sys.stdin.read() |
|
|
|
|
|
|
|
queues = collections.defaultdict(collections.deque) |
|
|
|
NAT = [] |
|
|
|
for n in range(50): |
|
|
|
threading.Thread(target=handle, args=[n], daemon=True).start() |
|
|
|
|
|
|
|
seen = set() |
|
|
|
while True: |
|
|
|
activity = sum(len(q) for q in queues.values()) |
|
|
|
if not activity and len(NAT): |
|
|
|
X, Y = NAT[-1] |
|
|
|
|
|
|
|
if len(NAT) == 1: |
|
|
|
print(Y) |
|
|
|
|
|
|
|
if Y in seen: |
|
|
|
print(Y) |
|
|
|
break |
|
|
|
|
|
|
|
queues[0] += [X, Y] |
|
|
|
seen.add(Y) |