14_robots.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env python3
  2. import sys
  3. import re
  4. from itertools import islice
  5. W = 101
  6. H = 103
  7. def walk(robots):
  8. positions, velocities = zip(*((r[:2], r[2:]) for r in robots))
  9. while True:
  10. positions = [((x + dx) % W, (y + dy) % H)
  11. for (x, y), (dx, dy) in zip(positions, velocities)]
  12. yield positions
  13. def safety(positions):
  14. quadrants = [0, 0, 0, 0]
  15. midx = W // 2
  16. midy = H // 2
  17. for x, y in positions:
  18. if x != midx and y != midy:
  19. quadrants[(x > midx) + 2 * (y > midy)] += 1
  20. a, b, c, d = quadrants
  21. return a * b * c * d
  22. def show(positions, start, stride):
  23. step = start
  24. for pos in map(set, islice(positions, start - 1, None, stride)):
  25. for y in range(H):
  26. print(''.join('.X'[(x, y) in pos] for x in range(W)))
  27. print('step', step)
  28. input('click ENTER for next step')
  29. step += stride
  30. positions = walk(tuple(map(int, re.findall(r'-?\d+', line)))
  31. for line in sys.stdin)
  32. print(safety(next(islice(positions, 99, None, 1))))
  33. #with open('input/14', 'r') as f:
  34. # robots = [tuple(map(int, re.findall(r'-?\d+', line))) for line in f]
  35. #positions = walk(robots)
  36. #show(positions, 129, 101)
  37. # Easter egg looks like this in step 7502:
  38. #
  39. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  40. # X.............................X
  41. # X.............................X
  42. # X.............................X
  43. # X.............................X
  44. # X..............X..............X
  45. # X.............XXX.............X
  46. # X............XXXXX............X
  47. # X...........XXXXXXX...........X
  48. # X..........XXXXXXXXX..........X
  49. # X............XXXXX............X
  50. # X...........XXXXXXX...........X
  51. # X..........XXXXXXXXX..........X
  52. # X.........XXXXXXXXXXX.........X
  53. # X........XXXXXXXXXXXXX........X
  54. # X..........XXXXXXXXX..........X
  55. # X.........XXXXXXXXXXX.........X
  56. # X........XXXXXXXXXXXXX........X
  57. # X.......XXXXXXXXXXXXXXX.......X
  58. # X......XXXXXXXXXXXXXXXXX......X
  59. # X........XXXXXXXXXXXXX........X
  60. # X.......XXXXXXXXXXXXXXX.......X
  61. # X......XXXXXXXXXXXXXXXXX......X
  62. # X.....XXXXXXXXXXXXXXXXXXX.....X
  63. # X....XXXXXXXXXXXXXXXXXXXXX....X
  64. # X.............XXX.............X
  65. # X.............XXX.............X
  66. # X.............XXX.............X
  67. # X.............................X
  68. # X.............................X
  69. # X.............................X
  70. # X.............................X
  71. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX