from lib import get_data, Grid2D, add2 data = """L.LL.LL.LL LLLLLLL.LL L.L.L..L.. LLLL.LL.LL L.LL.LL.LL L.LLLLL.LL ..L.L..... LLLLLLLLLL L.LLLLLL.L L.LLLLL.LL""" def part_1(data): g = Grid2D(data) seen = set() while True: h = g.hash() if h in seen: break seen.add(h) ng = g.clone_with_val(".") for r in range(g.n_rows): for c in range(g.n_cols): p = (r, c) s = g[p] if s == ".": continue occupied = sum([1 if g[nb] == "#" else 0 for nb in g.neighbors_adj(p)]) if s == "L" and occupied == 0: ng[p] = "#" elif s == "#" and occupied >= 4: ng[p] = "L" else: ng[p] = s g = ng print(len(g.find("#"))) def part_2(data): g = Grid2D(data) seen = set() while True: h = g.hash() if h in seen: break seen.add(h) ng = g.clone_with_val(".") for r in range(g.n_rows): for c in range(g.n_cols): p = (r, c) s = g[p] if s == ".": continue occupied = 0 for dir in g.COORDS_ORTH + g.COORDS_DIAG: np = p while True: np = add2(np, dir) if not g.contains(np): break elif g[np] == "#": occupied += 1 break elif g[np] == "L": break if s == "L" and occupied == 0: ng[p] = "#" elif s == "#" and occupied >= 5: ng[p] = "L" else: ng[p] = s g = ng print(len(g.find("#"))) def main(): data = get_data(__file__) part_1(data) part_2(data) if __name__ == "__main__": main()