You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 line
1.0KB

  1. import sys
  2. from itertools import product
  3. def span(n):
  4. return list(range(-n - 1, n + 2))
  5. def neighbors(pos):
  6. return {
  7. tuple(t + dt for t, dt in zip(pos, deltas))
  8. for deltas in product([-1, 0, 1], repeat=len(pos))
  9. if set(deltas) != {0}
  10. }
  11. def condition(known, pos):
  12. active = pos in known
  13. count = len(neighbors(pos) & known)
  14. return (active and count in {2, 3}) or (not active and count in {3})
  15. def evolve(known, dims, n_cycles):
  16. for _ in range(n_cycles):
  17. dims = [n + 1 for n in dims]
  18. known = {
  19. pos
  20. for pos in product(*map(span, dims))
  21. if condition(known, pos)
  22. }
  23. return known
  24. text = sys.stdin.read()
  25. known = {
  26. (x, y, 0)
  27. for y, ln in enumerate(text.splitlines())
  28. for x, char in enumerate(ln)
  29. if char == '#'
  30. }
  31. dims = tuple([
  32. max(x + 1 for x, _, _ in known),
  33. max(y + 1 for _, y, _ in known),
  34. max(z + 1 for _, _, z in known),
  35. ])
  36. print(len(evolve(known, dims, 6)))
  37. print(len(evolve({pt + (0,) for pt in known}, dims + (1,), 6)))