Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

52 linhas
1.4KB

  1. import sys
  2. from functools import lru_cache
  3. from toolkit import read_image
  4. def simple_adjace(level, pos):
  5. inbound = {pos + ori for ori in [1, -1, 1j, -1j]} & domain
  6. return [(level, p) for p in inbound]
  7. @lru_cache(maxsize=None)
  8. def recursive_adjace(level, pos, center=complex(2, 2)):
  9. neis = []
  10. for ori in [1, -1, 1j, -1j]:
  11. adj = pos + ori
  12. if adj == center:
  13. neis += [(level + 1, p) for p in domain if p - ori not in domain]
  14. elif adj not in domain:
  15. neis += [(level - 1, center + ori)]
  16. else:
  17. neis += [(level, adj)]
  18. return neis
  19. def evolve(bugs, adjacency, lim=None):
  20. seen_states = {bugs}
  21. while True:
  22. affected = {nei for tile in bugs for nei in adjacency(*tile)} | bugs
  23. will_change = {
  24. tile for tile in affected
  25. for count in [sum(nei in bugs for nei in adjacency(*tile))]
  26. if tile in bugs and count != 1
  27. or tile not in bugs and count in [1, 2]
  28. }
  29. bugs = bugs ^ will_change
  30. if bugs in seen_states or len(seen_states) == lim:
  31. break
  32. seen_states.add(bugs)
  33. return bugs
  34. text = sys.stdin.read()
  35. domain = set(read_image(text))
  36. bugs = frozenset((0, pos) for pos, c in read_image(text).items() if c == '#')
  37. final = evolve(bugs, simple_adjace)
  38. print(int(sum(2 ** (p.real + p.imag * 5) for _, p in final)))
  39. final = evolve(bugs, recursive_adjace, 200)
  40. print(len(final))