Solve day 21 and 22 2017.
This commit is contained in:
71
2017/d22.py
Normal file
71
2017/d22.py
Normal file
@@ -0,0 +1,71 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user