| import collections | |||||
| import re | |||||
| import sys | |||||
| def calc(pos): | |||||
| is_black = pos in active | |||||
| count = sum(pos + step in active for step in maps.values()) | |||||
| if is_black and count not in {1, 2}: | |||||
| return False | |||||
| elif not is_black and count == 2: | |||||
| return True | |||||
| return is_black | |||||
| text = sys.stdin.read() | |||||
| maps = {'w': 2, 'e': -2, 'nw': 1+1j, 'ne': -1+1j, 'sw': 1-1j, 'se': -1-1j} | |||||
| grid = collections.defaultdict(bool) | |||||
| for line in text.splitlines(): | |||||
| end = sum(map(maps.get, re.findall(r'(se|sw|nw|ne|e|w)', line))) | |||||
| grid[end] = not grid[end] | |||||
| active = {pos for pos in grid if grid[pos]} | |||||
| print(len(active)) | |||||
| for _ in range(100): | |||||
| active = {p + s for p in active for s in maps.values() if calc(p + s)} | |||||
| print(len(active)) |