for i in range(w): for j in range(h): d[i, j] = [] for u, v in ((1, 1), (1, 0), (1, -1), (0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1)): r = 1 while (0 <= i + r * u < w) and (0 <= j + r * v < h): if (i + r * u, j + r * v) in q: d[i, j].append((i + r * u, j + r * v)) break r += 1 c = set(q.keys()) while c: qq = dict(q) cc = set() for i, j in c: n = [q[k] for k in d[i, j]].count("#") if q[i, j] == "L" and n == 0: qq[i, j] = "#" cc.update(d[i, j]) elif q[i, j] == "#" and n >= 5: qq[i, j] = "L" cc.update(d[i, j]) q = qq c = cc print(list(p.values()).count("#"), list(q.values()).count("#")) aoc.tock()
import aoc data = aoc.strlist(3) p = len(data) q = len(data[0]) n = "".join(i[j % q] for i, j in zip(data, range(0, 3 * p, 3))).count("#") m = n for u, v in [(1, 1), (5, 1), (7, 1), (1, 2)]: m *= "".join(i[j % q] for i, j in zip(data[::v], range(0, u * p // v, u))).count("#") print(n, m) aoc.tock("ms")