Files
adventofcode/2024/06/part2.py
Kees van Kempen 242bacd75d 2024(6): god finally
I hate my code, though.
2024-12-28 23:07:51 +01:00

76 lines
2.0 KiB
Python

from part1 import *
verbose = False
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")
# Prepare forked map for speed
#forked_map = m.copy()
#forked_map = Map()
#forked_map.load_map("input")
#forked_map.load_map("testinput")
#begin_pos = m.pos
#begin_direction = m.direction
loop_obstacles = []
i = 0
while m.step():
#print(i)
if verbose:
print(m.pos, m.direction)
# Create a copy
#forked_map = m.copy()
forked_map = Map()
#forked_map.load_map("testinput")
forked_map.load_map("input")
#forked_map.map = m.map.copy()
#print(f"Forking map, setting obstacle at {m.next_pos()}, resetting current {m.pos} to {m.map[m.pos]}")
#forked_map.show()
next_pos = m.next_pos()
if next_pos in loop_obstacles or not forked_map.pos_in_map(next_pos):
print(f"Skip forking at {next_pos} as already in loop_obstacles or last.")
continue
forked_map.map[next_pos] = Map.Tiles.OBSTACLE.value
#forked_map.map[m.pos] = m.map[m.pos]
#forked_map.pos = begin_pos
#forked_map.direction = begin_direction
#forked_map.trace = [begin_pos]
#forked_map.show()
print(f"Forking at {next_pos}... ", end="")
try:
while forked_map.step():
continue
except Map.LoopException:
print("loop.")
loop_obstacles.append(m.next_pos())
#forked_map.show()
else:
print("no loop.")
i += 1
#if i > 100:
# break
#m.show()
#print(len(m.trace), m.trace)
#print(len(set(m.trace)))
print(len(set(loop_obstacles)))