72 lines
1.5 KiB
Python
72 lines
1.5 KiB
Python
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()
|