2024(6): this is an improvement

On to 2024(7)!
This commit is contained in:
2024-12-28 23:44:18 +01:00
parent 242bacd75d
commit 183b4428f7

View File

@ -2,6 +2,7 @@ from part1 import *
verbose = False verbose = False
sssst = True
thoughts = \ thoughts = \
""" """
@ -17,59 +18,59 @@ then travelled to that position at least twice from at least one
position; see Pigeonhole principle). position; see Pigeonhole principle).
""" """
#map_to_load = "testinput"
map_to_load = "input"
if __name__ == "__main__": if __name__ == "__main__":
m = Map() m = Map()
#m.load_map("testinput") m.load_map(map_to_load)
m.load_map("input")
# Prepare forked map for speed # Prepare forked map for speed
#forked_map = m.copy() forked_map = m.copy()
#forked_map = Map() #forked_map = Map()
#forked_map.load_map("input") #forked_map.load_map(map_to_load)
#forked_map.load_map("testinput") begin_pos = m.pos
#begin_pos = m.pos begin_direction = m.direction
#begin_direction = m.direction
trace = [m.pos]
while m.step():
trace.append(m.pos)
#print(trace)
loop_obstacles = [] loop_obstacles = []
i = 0
while m.step(): for i in range(1, len(trace)):
#print(i) pos, next_pos = trace[i - 1], trace[i]
if not forked_map.pos_in_map(next_pos):
continue
if verbose: if verbose:
print(m.pos, m.direction) print(m.pos, m.direction)
# Create a copy # Setup the fork
#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[next_pos] = Map.Tiles.OBSTACLE.value
#forked_map.map[m.pos] = m.map[m.pos] forked_map.map[pos] = m.map[pos]
#forked_map.pos = begin_pos forked_map.pos = begin_pos
#forked_map.direction = begin_direction forked_map.direction = begin_direction
#forked_map.trace = [begin_pos] forked_map.trace = [begin_pos]
forked_map.pos_counter *= 0
#print(forked_map.trace)
#forked_map.show() #forked_map.show()
print(f"Forking at {next_pos}... ", end="") if not sssst:
print(f"Forking at {next_pos}... ", end="")
try: try:
while forked_map.step(): while forked_map.step():
continue continue
except Map.LoopException: except Map.LoopException:
print("loop.") if not sssst:
loop_obstacles.append(m.next_pos()) print("loop.")
loop_obstacles.append(next_pos)
#print(forked_map.trace)
#forked_map.show() #forked_map.show()
else: else:
print("no loop.") if not sssst:
i += 1 print("no loop.")
#if i > 100: #print(forked_map.trace)
# break #forked_map.show()
#m.show()
#print(len(m.trace), m.trace)
#print(len(set(m.trace)))
print(len(set(loop_obstacles))) print(len(set(loop_obstacles)))