Browse Source

🚪

master
Roderic Day 2 years ago
parent
commit
39349bc140
1 changed files with 45 additions and 0 deletions
  1. +45
    -0
      y2022/p23.py

+ 45
- 0
y2022/p23.py View File

@@ -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(' '))

Loading…
Cancel
Save