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 lines
1.1 KiB

import sys
from itertools import product
def main():
lines = [line.rstrip() for line in sys.stdin]
print("Actives:", solve(lines, 3))
print("Hyperactives:", solve(lines, 4))
def solve(lines, dimensions):
s = {}
for y, line in enumerate(lines):
for x, c in enumerate(line):
p = (x, y) + (0,) * (dimensions - 2)
s[p] = 1 if c == "#" else 0
for _ in range(6):
cycle(s)
return sum(s.values())
def cycle(s):
future = {}
work_set = set(nn for pos in s for nn in near(*pos))
for pos in work_set:
an = 0
for nn in near(*pos):
an += s.get(nn, 0)
if (v := s.get(pos, 0)) == 1 and not 2 <= an <= 3:
future[pos] = 0
elif v == 0 and an == 3:
future[pos] = 1
for f, fv in future.items():
s[f] = fv
def near(*comp):
num_comp = len(comp)
offsets = list(product([-1, 0, 1], repeat=num_comp))
offsets.remove((0,) * num_comp)
for p in offsets:
yield tuple(c + o for c, o in zip(comp, p))
if __name__ == "__main__":
main()