advent_of_code/12/12_2.py

92 lines
2.7 KiB
Python
Raw Normal View History

2021-12-13 05:32:17 +01:00
#!/usr/bin/env python
2021-12-13 05:38:24 +01:00
# 2021 - Advent Of Code - 12 part 2
2021-12-13 05:32:17 +01:00
def parse_file(file):
with open(file) as f:
return [x.strip() for x in f.readlines()]
def special_cave(point, twice_cave):
if point == twice_cave[0] and twice_cave[1] > 0:
print(f'Using special cave: {twice_cave}')
return True
return False
def valid_destination(point, visited, twice_cave):
if point.isupper():
return True
if point not in visited:
return True
if point == twice_cave and visited.count(point) < 2:
print(f'Using special cave: {twice_cave}')
return True
return False
def explore_tree(current_node, visited, paths_list, twice_cave, gen):
possible_path = [c for c in connections if current_node in c.split('-')]
print(f'\n{gen} current_node: {current_node}\t possible path: {possible_path}')
print(f'{gen} visited: {visited}')
for path in possible_path:
print(f'{gen} exploring {path}')
new_visited = list(visited)
# check end
if 'end' in path:
visited.append('end')
paths_list.add(tuple(visited))
print(f'{gen} keeping path: {visited}')
continue
nodes = path.split('-')
if nodes[0] == current_node:
if valid_destination(nodes[1], visited, twice_cave):
print(f'{gen} destination: {nodes[1]}')
new_visited.append(nodes[1])
explore_tree(nodes[1], list(new_visited), paths_list, twice_cave, gen+1)
else:
print(f'{gen} removing dest: {nodes[1]}')
else:
if valid_destination(nodes[0], visited, twice_cave):
print(f'{gen} destination: {nodes[0]}')
new_visited.append(nodes[0])
explore_tree(nodes[0], list(new_visited), paths_list, twice_cave, gen+1)
else:
print(f'{gen} removing dest: {nodes[0]}')
# connections = parse_file('input_example3.txt')
connections = parse_file('input.txt')
print(f'connections: {connections}')
points = set()
for conn in connections:
p = conn.split('-')
points.add(p[0])
points.add(p[1])
print(f'unique points: {points}')
print()
starting_positions = [c for c in connections if 'start' in c]
ending_positions = [c for c in connections if 'end' in c]
small_caves = [c for c in points if c != 'start' and c != 'end' and c.islower()]
print(f'small caves: {small_caves}')
visited_nodes = ['start']
all_path = set()
for cave in small_caves:
explore_tree('start', visited_nodes, all_path, cave, 0)
explore_tree('start', visited_nodes, all_path, 'b', 0)
print()
print('listing all paths')
for p in all_path:
print(p)
print(f'{len(all_path)} paths')