| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- #!/usr/bin/env python3
- import sys
- def parse(f):
- data = f.read().rstrip()
- w = data.index('\n') + 2
- pad = [False] * (w + 1)
- grid = pad + [c == '#' for c in data.replace('\n', '..')] + pad
- return grid, w
- def animate(grid, w, steps, broken_corners):
- nboff = (-w - 1, -w, -w + 1,
- -1, 1,
- w - 1, w, w + 1)
- corners = (w + 1, 2 * w - 2, -2 * w + 1, -w - 2) \
- if broken_corners else ()
- h = len(grid) // w
- prev = [False] * len(grid)
- grid = [l for l in grid]
- for i in corners:
- grid[i] = True
- for step in range(steps):
- prev, grid = grid, prev
- for y in range(1, h - 1):
- for x in range(1, w - 1):
- i = y * w + x
- on = prev[i]
- nbon = sum(int(prev[i + off]) for off in nboff)
- grid[i] = nbon == 3 or (on and nbon == 2)
- for i in corners:
- grid[i] = True
- return sum(map(int, grid))
- grid, w = parse(sys.stdin)
- print(animate(grid, w, 100, False))
- print(animate(grid, w, 100, True))
|