Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

46 lines
1.2KB

  1. rows = open(0).read().splitlines()
  2. grid = {complex(x, y) for y, l in enumerate(rows)
  3. for x, c in enumerate(l) if c in '#'}
  4. dir8 = {dx + dy for dx in [-1, 0, 1]
  5. for dy in [-1j, 0, 1j] if not dx + dy == 0}
  6. dir3 = [(k, {k, k + k * 1j, k - k * 1j}) for k in [-1j, 1j, -1, 1]]
  7. def render(grid):
  8. xmin, *_, xmax = sorted(int(p.real) for p in grid)
  9. ymin, *_, ymax = sorted(int(p.imag) for p in grid)
  10. sab = ''
  11. for y in range(ymin, ymax + 1):
  12. for x in range(xmin, xmax + 1):
  13. sab += grid.get(complex(x, y), ' ')
  14. sab += '\n'
  15. return sab
  16. def look(p):
  17. for k, ds in dir3:
  18. if not {p + d for d in ds} & grid:
  19. return p + k
  20. for i in range(1, 100000):
  21. moves = {}
  22. for p in grid:
  23. if not any(p + dp in grid for dp in dir8):
  24. continue
  25. moves.setdefault(look(p), []).append(p)
  26. dir3 = dir3[1:] + dir3[:1]
  27. if not moves:
  28. print(i)
  29. break
  30. for k, vs in moves.items():
  31. if k is not None:
  32. if len(vs) == 1:
  33. grid = grid - set(vs) | {k}
  34. if i == 10:
  35. print(render({k: '#' for k in grid}).count(' '))