23_network.py 1.1 KB

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