From 1ac455d7a191b52020aac0d6f408febc14a37993 Mon Sep 17 00:00:00 2001 From: Benjo Date: Sun, 12 Dec 2021 11:49:05 +0100 Subject: [PATCH] day 12 --- 12/12.py | 31 +++++++++++++++++++++++++++++++ 12/input | 24 ++++++++++++++++++++++++ 12/testInput | 7 +++++++ 3 files changed, 62 insertions(+) create mode 100644 12/12.py create mode 100644 12/input create mode 100644 12/testInput diff --git a/12/12.py b/12/12.py new file mode 100644 index 0000000..aa80e1b --- /dev/null +++ b/12/12.py @@ -0,0 +1,31 @@ + +with open("input") as file: + lines = file.read().splitlines() + edges = [set(line.split("-")) for line in lines] + + +def getAdjacent(knot: str) -> set[str]: + return {edge.difference({knot}).pop() for edge in edges if knot in edge} + + +def solve(): + def find(knot: str, visited: set[str], smallUsedTwice: bool) -> set[tuple[str, ...]]: + if knot == "end": + return {"end"} + foundPaths = set() + newVisited = visited.union({knot}) if knot.islower() else visited + for k in getAdjacent(knot).difference(visited): + if knot.islower() and not smallUsedTwice and knot != "start": + for p in find(k, visited, True): + foundPaths.add((knot, *p)) + for p in find(k, newVisited, smallUsedTwice): + foundPaths.add((knot, *p)) + return foundPaths + + paths1 = find("start", set(), True) + paths2 = find("start", set(), False) + + print(len(paths1), len(paths2)) + + +solve() diff --git a/12/input b/12/input new file mode 100644 index 0000000..52cfe6a --- /dev/null +++ b/12/input @@ -0,0 +1,24 @@ +EG-bj +LN-end +bj-LN +yv-start +iw-ch +ch-LN +EG-bn +OF-iw +LN-yv +iw-TQ +iw-start +TQ-ch +EG-end +bj-OF +OF-end +TQ-start +TQ-bj +iw-LN +EG-ch +yv-iw +KW-bj +OF-ch +bj-ch +yv-TQ diff --git a/12/testInput b/12/testInput new file mode 100644 index 0000000..898cd56 --- /dev/null +++ b/12/testInput @@ -0,0 +1,7 @@ +start-A +start-b +A-c +A-b +b-d +A-end +b-end \ No newline at end of file