From 0473bf6da259e41029a0d547feb163b3d84e38d0 Mon Sep 17 00:00:00 2001 From: Pascal Lais Date: Sun, 12 Dec 2021 22:10:55 +0100 Subject: [PATCH] Add day 12 solution --- day-12/day-12.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ day-12/input.txt | 24 +++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 day-12/day-12.py create mode 100644 day-12/input.txt diff --git a/day-12/day-12.py b/day-12/day-12.py new file mode 100644 index 0000000..b201f47 --- /dev/null +++ b/day-12/day-12.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +from pathlib import Path + + +def process_node(node, available_edges, visited): + paths = [] + if node == "end": + return [[node]] + if node.islower(): + visited.add(node) + neighbors = [[n for n in e if n != node] + for e in available_edges if node in e] + for n in neighbors: + n = n[0] + if n not in visited: + next = process_node(n, available_edges, visited) + for p in next: + paths.append([node] + p) + if node in visited: + visited.remove(node) + return paths + + +def process_node_twice(node, available_edges, visited, twice): + paths = [] + if node == "end": + return [[node]] + if node.islower(): + if node in visited and twice: + return paths + elif node in visited and node != "start": + twice = node + else: + visited.add(node) + neighbors = [[n for n in e if n != node] + for e in available_edges if node in e] + for n in neighbors: + n = n[0] + if n not in visited or twice != node and n != "start": + next = process_node_twice(n, available_edges, visited, twice) + for p in next: + paths.append([node] + p) + if twice == node: + twice = "" + 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(), "") + 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) diff --git a/day-12/input.txt b/day-12/input.txt new file mode 100644 index 0000000..aee752f --- /dev/null +++ b/day-12/input.txt @@ -0,0 +1,24 @@ +pf-pk +ZQ-iz +iz-NY +ZQ-end +pf-gx +pk-ZQ +ZQ-dc +NY-start +NY-pf +NY-gx +ag-ZQ +pf-start +start-gx +BN-ag +iz-pf +ag-FD +pk-NY +gx-pk +end-BN +ag-pf +iz-pk +pk-ag +iz-end +iz-BN \ No newline at end of file