24_hexes.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/env python3
  2. import sys
  3. DIFFS = {'e': (1, 0), 'w': (-1, 0), 'se': (0, -1),
  4. 'sw': (-1, -1), 'ne': (1, 1), 'nw': (0, 1)}
  5. def walk(line):
  6. x = y = 0
  7. vert = ''
  8. for char in line.rstrip():
  9. if char in 'sn':
  10. vert = char
  11. else:
  12. dx, dy = DIFFS[vert + char]
  13. x += dx
  14. y += dy
  15. vert = ''
  16. return x, y
  17. def flip(coords):
  18. tiles = {}
  19. for xy in coords:
  20. tiles[xy] = not tiles.get(xy, False)
  21. return list(xy for xy, black in tiles.items() if black)
  22. def evolve(black, days):
  23. black = set(black)
  24. for day in range(days):
  25. makewhite = set()
  26. white = {}
  27. for x, y in black:
  28. nbs = [(x + dx, y + dy) for dx, dy in DIFFS.values()]
  29. black_nbs = sum(nb in black for nb in nbs)
  30. if black_nbs == 0 or black_nbs > 2:
  31. makewhite.add((x, y))
  32. white.update({nb: white.get(nb, 0) + 1
  33. for nb in nbs if nb not in black})
  34. black -= makewhite
  35. black |= {xy for xy, black_nbs in white.items() if black_nbs == 2}
  36. return black
  37. black = flip(map(walk, sys.stdin))
  38. print(len(black))
  39. print(len(evolve(black, 100)))