summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2024-12-19 22:51:52 +0000
committermhsn <mail@mhsn.net>2024-12-19 22:51:52 +0000
commit380f83357eedb003ec7aae1ea7244adea6c266a7 (patch)
tree104e0cbc3cc84412549116e249bebc8e6d27d8fc
parent64ab7f4bcbb4d094eec4be7272f7383af32c590b (diff)
downloadaoc-380f83357eedb003ec7aae1ea7244adea6c266a7.tar.gz
aoc-380f83357eedb003ec7aae1ea7244adea6c266a7.zip
2024-19 python p2
-rw-r--r--2024/19/python/main.py33
1 files changed, 12 insertions, 21 deletions
diff --git a/2024/19/python/main.py b/2024/19/python/main.py
index 9889970..a41156c 100644
--- a/2024/19/python/main.py
+++ b/2024/19/python/main.py
@@ -1,4 +1,5 @@
from fileinput import input
+from functools import cache
from itertools import takewhile
inp = map(str.strip, input())
@@ -17,33 +18,23 @@ for towel in towels:
prev[towel[-1]] = (True, curr)
-def drops(design, start=0):
+@cache
+def steps(design, n=0):
+ if n == len(design):
+ return 1
+ ways = 0
curr = trie
- for n, s in enumerate(design[start:], start=start + 1):
+ for d, s in enumerate(design[n:], start=1):
if s not in curr:
- return
+ return ways
term, curr = curr[s]
if term:
- yield n
+ ways += steps(design, n + d)
+ return ways
-def match(design):
- q = list(drops(design))
- seen = set()
- while q:
- n = q.pop()
- if n == len(design):
- return True
- if n in seen:
- continue
- seen.add(n)
- for d in drops(design, n):
- q.append(d)
- return False
-
-
-silver = sum(map(match, designs))
-gold = 0
+silver = sum(map(bool, map(steps, designs)))
+gold = sum(map(steps, designs))
print("silver:", silver)
print("gold:", gold)