import itertools import sys import toolkit def is_taken(pos, state): taken = sum(pos + step in state for step in moves) if pos not in state and not taken: return True elif pos in state and taken >= 4: return False return pos in state def is_taken2(pos, state): taken = 0 for step in moves: for x in itertools.count(1): adj = (pos + step * x) if adj in seats or adj not in grid: taken += adj in state break if pos not in state and not taken: return True elif pos in state and taken >= 5: return False return pos in state text = sys.stdin.read() grid, _, _ = toolkit.read_image(text) moves = {dx + dy for dx in [-1, 0, 1] for dy in [-1j, 0, 1j]} - {0} seats = {pos for pos, value in grid.items() if value != '.'} for fn in [is_taken, is_taken2]: state = frozenset() seen = set() while state not in seen: seen.add(state) state = frozenset({pos for pos in seats if fn(pos, state)}) print(len(state))