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