No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

47 líneas
883B

  1. import collections
  2. import sys
  3. import threading
  4. from intcode import compute
  5. def communicate(n):
  6. yield n
  7. while True:
  8. while queues[n]:
  9. yield queues[n].popleft()
  10. yield -1
  11. def handle(n):
  12. bot = compute(text, communicate(n))
  13. for addr, X, Y in zip(bot, bot, bot):
  14. if addr == 255:
  15. NAT.append((X, Y))
  16. else:
  17. queues[addr].extend((X, Y))
  18. text = sys.stdin.read()
  19. queues = collections.defaultdict(collections.deque)
  20. NAT = []
  21. for n in range(50):
  22. threading.Thread(target=handle, args=[n], daemon=True).start()
  23. seen = set()
  24. while True:
  25. activity = sum(len(q) for q in queues.values())
  26. if not activity and len(NAT):
  27. X, Y = NAT[-1]
  28. if len(NAT) == 1:
  29. print(Y)
  30. if Y in seen:
  31. print(Y)
  32. break
  33. queues[0] += [X, Y]
  34. seen.add(Y)