|
- 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)
|