|
|
@@ -0,0 +1,47 @@ |
|
|
|
import sys |
|
|
|
from itertools import product |
|
|
|
|
|
|
|
|
|
|
|
def span(n): |
|
|
|
return list(range(-n - 1, n + 2)) |
|
|
|
|
|
|
|
|
|
|
|
def neighbors(pos): |
|
|
|
return { |
|
|
|
tuple(t + dt for t, dt in zip(pos, deltas)) |
|
|
|
for deltas in product([-1, 0, 1], repeat=len(pos)) |
|
|
|
if set(deltas) != {0} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
def condition(known, pos): |
|
|
|
active = pos in known |
|
|
|
count = len(neighbors(pos) & known) |
|
|
|
return (active and count in {2, 3}) or (not active and count in {3}) |
|
|
|
|
|
|
|
|
|
|
|
def evolve(known, dims, n_cycles): |
|
|
|
for _ in range(n_cycles): |
|
|
|
dims = [n + 1 for n in dims] |
|
|
|
known = { |
|
|
|
pos |
|
|
|
for pos in product(*map(span, dims)) |
|
|
|
if condition(known, pos) |
|
|
|
} |
|
|
|
return known |
|
|
|
|
|
|
|
|
|
|
|
text = sys.stdin.read() |
|
|
|
known = { |
|
|
|
(x, y, 0) |
|
|
|
for y, ln in enumerate(text.splitlines()) |
|
|
|
for x, char in enumerate(ln) |
|
|
|
if char == '#' |
|
|
|
} |
|
|
|
dims = tuple([ |
|
|
|
max(x + 1 for x, _, _ in known), |
|
|
|
max(y + 1 for _, y, _ in known), |
|
|
|
max(z + 1 for _, _, z in known), |
|
|
|
]) |
|
|
|
print(len(evolve(known, dims, 6))) |
|
|
|
print(len(evolve({pt + (0,) for pt in known}, dims + (1,), 6))) |