43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from part1 import *
|
|
|
|
thoughts = \
|
|
"""
|
|
So, we can place an obstacle on each of the 130*130 - #obstacles = 16900
|
|
- obstacles positions, but the initial path only covers 1512 positions
|
|
(thus 1512 - 1 = 1511 steps). By instead placing an obstacle on each of
|
|
those steps, we can find a loop.
|
|
|
|
The other thing we need to do, is detect loops. For that, It would be
|
|
nice to store both positions and directions to establish uniqueness,
|
|
or just check whether it is the fifth time in a position (as we have
|
|
then travelled to that position at least twice from at least one
|
|
position; see Pigeonhole principle).
|
|
"""
|
|
|
|
if __name__ == "__main__":
|
|
m = Map()
|
|
#m.load_map("testinput")
|
|
m.load_map("input")
|
|
loop_obstacles = []
|
|
|
|
while m.step():
|
|
if verbose:
|
|
print(m.pos, m.direction)
|
|
|
|
# Create a copy
|
|
forked_map = m.copy()
|
|
forked_map.map[forked_map.next_pos()] = Map.Tiles.OBSTACLE.value
|
|
print(f"Forking at {forked_map.next_pos()}... ", end="")
|
|
try:
|
|
while forked_map.step():
|
|
continue
|
|
except Map.LoopException:
|
|
print("loop.")
|
|
loop_obstacles.append(m.next_pos())
|
|
else:
|
|
print("no loop.")
|
|
#m.show()
|
|
#print(len(m.trace), m.trace)
|
|
#print(len(set(m.trace)))
|
|
print(len(loop_obstacles))
|