From e953a322351d93acca0216412b277e1f15d8cbf2 Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Sun, 12 Dec 2021 17:13:10 +0100 Subject: [PATCH] Day 12 --- day12/input.txt | 26 ++++++++++++++++++++++++++ day12/part1.py | 27 +++++++++++++++++++++++++++ day12/part2.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 day12/input.txt create mode 100644 day12/part1.py create mode 100644 day12/part2.py diff --git a/day12/input.txt b/day12/input.txt new file mode 100644 index 0000000..f60a240 --- /dev/null +++ b/day12/input.txt @@ -0,0 +1,26 @@ +CV-mk +gm-IK +sk-gm +ca-sk +sx-mk +gm-start +sx-ca +kt-sk +ca-VS +kt-ml +kt-ca +mk-IK +end-sx +end-sk +gy-sx +end-ca +ca-ml +gm-CV +sx-kt +start-CV +IK-start +CV-kt +ml-mk +ml-CV +ml-gm +ml-IK diff --git a/day12/part1.py b/day12/part1.py new file mode 100644 index 0000000..24f11f3 --- /dev/null +++ b/day12/part1.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +from collections import defaultdict + +lines = (x.strip() for x in open("input.txt")) +paths = defaultdict(set) +stored_sum = {} + +for line in lines: + a, b = line.split("-") + paths[a].add(b) + paths[b].add(a) + + +def visit(node, visited): + store_key = hash((node, frozenset(visited))) + if node == 'end': + return 1 + elif store_key not in stored_sum: + stored_sum[store_key] = sum( + visit(nxt, visited.union([nxt]) if nxt != nxt.upper() else visited) + for nxt in paths[node].difference(visited) + ) + return stored_sum[store_key] + + + +print(visit('start', {'start'})) diff --git a/day12/part2.py b/day12/part2.py new file mode 100644 index 0000000..b2fb5dd --- /dev/null +++ b/day12/part2.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +from collections import defaultdict + +lines = (x.strip() for x in open("input.txt")) +paths = defaultdict(set) +stored_sum = {} + +for line in lines: + a, b = line.split("-") + paths[a].add(b) + paths[b].add(a) + + +def visit(node, visited): + store_key = hash((node, frozenset(hash((k, v)) for k, v in visited.items()))) + if node == 'end': + return 1 + elif store_key not in stored_sum: + has_twice = max(visited.values()) > 1 + stored_sum[store_key] = sum( + visit(nxt, {**visited, nxt: visited.get(nxt, 0) + 1} if nxt != nxt.upper() else visited) + for nxt in paths[node].difference( + set(k for k, v in visited.items() if v >= (1 if has_twice else 2) or (v == 1 and k == 'start')) + ) + ) + return stored_sum[store_key] + + +print(visit('start', {'start': 1}))