18_lightanim.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. data = f.read().rstrip()
  5. w = data.index('\n') + 2
  6. pad = [False] * (w + 1)
  7. grid = pad + [c == '#' for c in data.replace('\n', '..')] + pad
  8. return grid, w
  9. def animate(grid, w, steps, broken_corners):
  10. nboff = (-w - 1, -w, -w + 1,
  11. -1, 1,
  12. w - 1, w, w + 1)
  13. corners = (w + 1, 2 * w - 2, -2 * w + 1, -w - 2) \
  14. if broken_corners else ()
  15. h = len(grid) // w
  16. prev = [False] * len(grid)
  17. grid = [l for l in grid]
  18. for i in corners:
  19. grid[i] = True
  20. for step in range(steps):
  21. prev, grid = grid, prev
  22. for y in range(1, h - 1):
  23. for x in range(1, w - 1):
  24. i = y * w + x
  25. on = prev[i]
  26. nbon = sum(int(prev[i + off]) for off in nboff)
  27. grid[i] = nbon == 3 or (on and nbon == 2)
  28. for i in corners:
  29. grid[i] = True
  30. return sum(map(int, grid))
  31. grid, w = parse(sys.stdin)
  32. print(animate(grid, w, 100, False))
  33. print(animate(grid, w, 100, True))