11_octoflash.py 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/env python3
  2. import sys
  3. from itertools import count
  4. def parse(content):
  5. return list(map(int, content.replace('\n', ''))), content.find('\n')
  6. def flash(grid, w):
  7. h = len(grid) // w
  8. def neighbors(i):
  9. y, x = divmod(i, w)
  10. if y:
  11. if x: yield i - w - 1
  12. yield i - w
  13. if x < w - 1: yield i - w + 1
  14. if x: yield i - 1
  15. if x < w - 1: yield i + 1
  16. if y < h - 1:
  17. if x: yield i + w - 1
  18. yield i + w
  19. if x < w - 1: yield i + w + 1
  20. def increase(i):
  21. grid[i] += 1
  22. if grid[i] == 10:
  23. for nb in neighbors(i):
  24. increase(nb)
  25. for i in range(len(grid)):
  26. increase(i)
  27. flashed = 0
  28. for i, energy in enumerate(grid):
  29. if energy > 9:
  30. flashed += 1
  31. grid[i] = 0
  32. return flashed
  33. grid, w = parse(sys.stdin.read())
  34. print(sum(flash(grid, w) for i in range(100)))
  35. print(next(n for n in count(101) if flash(grid, w) == len(grid)))