2024(6): this is an improvement
On to 2024(7)!
This commit is contained in:
@ -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)))
|
||||||
|
|||||||
Reference in New Issue
Block a user