from lib import Grid2D, add2 def part_1(data): steps = 10_000 g = Grid2D(data) # g.print() dirs = [g.N, g.E, g.S, g.W] pos = (g.n_rows // 2, g.n_cols // 2) dir = g.N inf = set(g.find("#")) burst_inf = 0 for _ in range(steps): if pos in inf: # turn right dir = dirs[(dirs.index(dir) + 1) % len(dirs)] inf.remove(pos) else: # turn left dir = dirs[(dirs.index(dir) - 1) % len(dirs)] inf.add(pos) burst_inf += 1 pos = add2(pos, dir) print(burst_inf) def part_2(data): steps = 10000000 g = Grid2D(data) dirs = [g.N, g.E, g.S, g.W] pos = (g.n_rows // 2, g.n_cols // 2) dir = g.N weak = set() inf = set(g.find("#")) flagged = set() burst_inf = 0 for _ in range(steps): if pos in weak: weak.remove(pos) inf.add(pos) burst_inf += 1 elif pos in inf: dir = dirs[(dirs.index(dir) + 1) % len(dirs)] inf.remove(pos) flagged.add(pos) elif pos in flagged: dir = dirs[(dirs.index(dir) + 2) % len(dirs)] flagged.remove(pos) else: dir = dirs[(dirs.index(dir) - 1) % len(dirs)] weak.add(pos) pos = add2(pos, dir) print(burst_inf) def main(): data = open(0).read() part_1(data) part_2(data) if __name__ == "__main__": main()