| rows = open(0).read().splitlines() | |||||
| grid = {complex(x, y) for y, l in enumerate(rows) | |||||
| for x, c in enumerate(l) if c in '#'} | |||||
| dir8 = {dx + dy for dx in [-1, 0, 1] | |||||
| for dy in [-1j, 0, 1j] if not dx + dy == 0} | |||||
| dir3 = [(k, {k, k + k * 1j, k - k * 1j}) for k in [-1j, 1j, -1, 1]] | |||||
| def render(grid): | |||||
| xmin, *_, xmax = sorted(int(p.real) for p in grid) | |||||
| ymin, *_, ymax = sorted(int(p.imag) for p in grid) | |||||
| sab = '' | |||||
| for y in range(ymin, ymax + 1): | |||||
| for x in range(xmin, xmax + 1): | |||||
| sab += grid.get(complex(x, y), ' ') | |||||
| sab += '\n' | |||||
| return sab | |||||
| def look(p): | |||||
| for k, ds in dir3: | |||||
| if not {p + d for d in ds} & grid: | |||||
| return p + k | |||||
| for i in range(1, 100000): | |||||
| moves = {} | |||||
| for p in grid: | |||||
| if not any(p + dp in grid for dp in dir8): | |||||
| continue | |||||
| moves.setdefault(look(p), []).append(p) | |||||
| dir3 = dir3[1:] + dir3[:1] | |||||
| if not moves: | |||||
| print(i) | |||||
| break | |||||
| for k, vs in moves.items(): | |||||
| if k is not None: | |||||
| if len(vs) == 1: | |||||
| grid = grid - set(vs) | {k} | |||||
| if i == 10: | |||||
| print(render({k: '#' for k in grid}).count(' ')) |