|
|
@@ -0,0 +1,45 @@ |
|
|
|
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(' ')) |