23_network.py 1017 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env python3
  2. import sys
  3. from intcode import read_program, run
  4. def run_nat(program):
  5. nics, messages = zip(*[(run(program), [i]) for i in range(50)])
  6. natpack = 0, 0
  7. for nic in nics:
  8. assert next(nic) is None
  9. while True:
  10. for nic, msg in zip(nics, messages):
  11. msg.append(-1)
  12. while msg:
  13. dst = nic.send(msg.pop(0))
  14. while dst is not None:
  15. pack = next(nic), next(nic)
  16. if dst == 255:
  17. natpack = pack
  18. else:
  19. messages[dst].extend(pack)
  20. dst = next(nic)
  21. if not any(messages):
  22. messages[0].extend(natpack)
  23. yield natpack[1]
  24. def find_repeated_natpack(program):
  25. seen = set()
  26. for y in run_nat(program):
  27. if y in seen:
  28. return y
  29. seen.add(y)
  30. program = read_program(sys.stdin)
  31. print(next(run_nat(program)))
  32. print(find_repeated_natpack(program))