From 2e38177e92d8aee85ed6179d2d23241882dba6ed Mon Sep 17 00:00:00 2001 From: setop Date: Sun, 5 Jan 2025 00:30:53 +0100 Subject: [PATCH] day 11, rewrite for codon, get 10x speedup --- d11/run.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/d11/run.py b/d11/run.py index 8391b49..814ce14 100644 --- a/d11/run.py +++ b/d11/run.py @@ -1,21 +1,24 @@ import sys from math import log10 -from functools import cache -@cache +D = dict() # cache + def mutate(n:int, t:int) -> int: - if t == 0: - return 1 - if n == 0: - return mutate(1, t-1) - if (digits := int(log10(n))+1) & 1 == 0: - return count(divmod(n, 10**(digits//2)), t-1) - return mutate(n*2024, t-1) - -def count(stones: list[int], times: int) -> int: - return sum(mutate(stone, times) for stone in stones) + x = D.get((n,t),-1) + if x < 0: + if t == 0: + x = 1 + elif n == 0: + x = mutate(1, t-1) + elif (digits := int(log10(n))+1) & 1 == 0: # even nb of digits + l, r = divmod(n, 10**(digits//2)) + x = mutate(l, t-1) + mutate(r, t-1) + else: + x = mutate(n*2024, t-1) + D[(n,t)] = x + return x stones = [int(n) for n in sys.stdin.read().strip().split(" ")] -print(count(stones, 25)) -print(count(stones, 75)) +for times in [25,75]: + print(sum(mutate(stone, times) for stone in stones))