| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #!/usr/bin/env python3
- import sys
- DIFFS = {'e': (1, 0), 'w': (-1, 0), 'se': (0, -1),
- 'sw': (-1, -1), 'ne': (1, 1), 'nw': (0, 1)}
- def walk(line):
- x = y = 0
- vert = ''
- for char in line.rstrip():
- if char in 'sn':
- vert = char
- else:
- dx, dy = DIFFS[vert + char]
- x += dx
- y += dy
- vert = ''
- return x, y
- def flip(coords):
- tiles = {}
- for xy in coords:
- tiles[xy] = not tiles.get(xy, False)
- return list(xy for xy, black in tiles.items() if black)
- def evolve(black, days):
- black = set(black)
- for day in range(days):
- makewhite = set()
- white = {}
- for x, y in black:
- nbs = [(x + dx, y + dy) for dx, dy in DIFFS.values()]
- black_nbs = sum(nb in black for nb in nbs)
- if black_nbs == 0 or black_nbs > 2:
- makewhite.add((x, y))
- white.update({nb: white.get(nb, 0) + 1
- for nb in nbs if nb not in black})
- black -= makewhite
- black |= {xy for xy, black_nbs in white.items() if black_nbs == 2}
- return black
- black = flip(map(walk, sys.stdin))
- print(len(black))
- print(len(evolve(black, 100)))
|