All checks were successful
continuous-integration/drone/push Build is passing
Use deque instead of list
81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
from collections import deque
|
|
|
|
|
|
def process_node(node, available_edges, visited):
|
|
paths = deque()
|
|
if node == "end":
|
|
paths.append(deque(node))
|
|
return paths
|
|
if node.islower():
|
|
visited.add(node)
|
|
neighbors = [n for e in available_edges if node in e for n in e if n != node]
|
|
for n in neighbors:
|
|
if n not in visited:
|
|
nxt = process_node(n, available_edges, visited)
|
|
for p in nxt:
|
|
p.appendleft(node)
|
|
paths.append(p)
|
|
if node in visited:
|
|
visited.remove(node)
|
|
return paths
|
|
|
|
|
|
def process_node_twice(node, available_edges, visited, visited_twice):
|
|
paths = deque()
|
|
if node == "end":
|
|
paths.append(deque(node))
|
|
return paths
|
|
if node.islower():
|
|
if node in visited and visited_twice:
|
|
return paths
|
|
elif node in visited and node != "start":
|
|
visited_twice = node
|
|
else:
|
|
visited.add(node)
|
|
neighbors = [n for e in available_edges if node in e for n in e if n != node]
|
|
for n in neighbors:
|
|
if n not in visited or visited_twice != node and n != "start":
|
|
nxt = process_node_twice(n, available_edges, visited, visited_twice)
|
|
for p in nxt:
|
|
p.appendleft(node)
|
|
paths.append(p)
|
|
if visited_twice == node:
|
|
visited_twice = None
|
|
elif node in visited:
|
|
visited.remove(node)
|
|
return paths
|
|
|
|
|
|
def part_1(input):
|
|
result = 0
|
|
edges = []
|
|
for line in input:
|
|
n_start, n_end = line.strip().split('-')
|
|
e = (n_start, n_end)
|
|
edges.append(e)
|
|
paths = process_node("start", edges, set())
|
|
result = len(paths)
|
|
print("Part 1 result:", result)
|
|
|
|
|
|
def part_2(input):
|
|
result = 0
|
|
edges = []
|
|
for line in input:
|
|
n_start, n_end = line.strip().split('-')
|
|
e = (n_start, n_end)
|
|
edges.append(e)
|
|
paths = process_node_twice("start", edges, set(), None)
|
|
result = len(paths)
|
|
print("Part 2 result:", result)
|
|
|
|
|
|
input = list()
|
|
p = Path(__file__).with_name('input.txt')
|
|
with open(p) as f:
|
|
input = f.readlines()
|
|
part_1(input)
|
|
part_2(input)
|