| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- #!/usr/bin/env python3
- import sys
- from itertools import count
- def parse(content):
- return list(map(int, content.replace('\n', ''))), content.find('\n')
- def flash(grid, w):
- h = len(grid) // w
- def neighbors(i):
- y, x = divmod(i, w)
- if y:
- if x: yield i - w - 1
- yield i - w
- if x < w - 1: yield i - w + 1
- if x: yield i - 1
- if x < w - 1: yield i + 1
- if y < h - 1:
- if x: yield i + w - 1
- yield i + w
- if x < w - 1: yield i + w + 1
- def increase(i):
- grid[i] += 1
- if grid[i] == 10:
- for nb in neighbors(i):
- increase(nb)
- for i in range(len(grid)):
- increase(i)
- flashed = 0
- for i, energy in enumerate(grid):
- if energy > 9:
- flashed += 1
- grid[i] = 0
- return flashed
- grid, w = parse(sys.stdin.read())
- print(sum(flash(grid, w) for i in range(100)))
- print(next(n for n in count(101) if flash(grid, w) == len(grid)))
|