#!/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 += nxt if node in visited: visited.remove(node) return paths def process_node_twice(node, available_edges, visited, visited_twice): num_paths = 0 if node == "end": return 1 if node.islower(): if node in visited and visited_twice: return num_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": num_paths += process_node_twice(n, available_edges, visited, visited_twice) if visited_twice == node: visited_twice = None elif node in visited: visited.remove(node) return num_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) result = process_node_twice("start", edges, set(), None) 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)