summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-01-01 15:03:25 +0000
committermhsn <mail@mhsn.net>2025-01-01 15:03:25 +0000
commit1e182828bb9b3f8d0643a6eda3cd3b31eb85393c (patch)
tree239a2e1f7f352c7a0382da60375b09a8b5acfefd
parent7698e9eb6e5fbc41bfdef6a645d5ec6b318233d3 (diff)
downloadaoc-1e182828bb9b3f8d0643a6eda3cd3b31eb85393c.tar.gz
aoc-1e182828bb9b3f8d0643a6eda3cd3b31eb85393c.zip
2024-22 python p2
-rw-r--r--2024/22/python/main.py40
1 files changed, 37 insertions, 3 deletions
diff --git a/2024/22/python/main.py b/2024/22/python/main.py
index 2354726..c290858 100644
--- a/2024/22/python/main.py
+++ b/2024/22/python/main.py
@@ -1,10 +1,11 @@
+from collections import Counter, deque
from fileinput import input
from itertools import islice
lines = [int(line.strip()) for line in input()]
-def prices(secret):
+def secrets(secret):
x = secret
while True:
yield x
@@ -16,8 +17,41 @@ def prices(secret):
x &= 0xFFFFFF
-silver = sum(next(islice(prices(x), 2000, None)) for x in lines)
-gold = 0
+def prices(it):
+ for s in it:
+ yield s % 10
+
+
+def diff(it):
+ prev = next(it)
+ for curr in it:
+ yield curr, curr - prev
+ prev = curr
+
+
+def to_seqs(it, n=4):
+ head = map(lambda x: x[1], islice(it, n - 1))
+ q = deque(head, maxlen=n)
+ for price, diff in it:
+ q.append(diff)
+ yield price, tuple(q)
+
+
+def seq_sells(it):
+ sells = {}
+ for price, diff in it:
+ if diff in sells:
+ continue
+ sells[diff] = price
+ return sells
+
+
+best_seqs = Counter()
+for x in lines:
+ best_seqs += seq_sells(to_seqs(islice(diff(prices(secrets(x))), 2000)))
+
+silver = sum(next(islice(secrets(x), 2000, None)) for x in lines)
+gold = best_seqs.most_common(1)[0][1]
print("silver:", silver)
print("gold:", gold)