day 11, rewrite for codon, get 10x speedup

This commit is contained in:
setop 2025-01-05 00:30:53 +01:00
parent dd493270fd
commit 2e38177e92
1 changed files with 17 additions and 14 deletions

View File

@ -1,21 +1,24 @@
import sys import sys
from math import log10 from math import log10
from functools import cache
@cache D = dict() # cache
def mutate(n:int, t:int) -> int: def mutate(n:int, t:int) -> int:
if t == 0: x = D.get((n,t),-1)
return 1 if x < 0:
if n == 0: if t == 0:
return mutate(1, t-1) x = 1
if (digits := int(log10(n))+1) & 1 == 0: elif n == 0:
return count(divmod(n, 10**(digits//2)), t-1) x = mutate(1, t-1)
return mutate(n*2024, t-1) elif (digits := int(log10(n))+1) & 1 == 0: # even nb of digits
l, r = divmod(n, 10**(digits//2))
def count(stones: list[int], times: int) -> int: x = mutate(l, t-1) + mutate(r, t-1)
return sum(mutate(stone, times) for stone in stones) else:
x = mutate(n*2024, t-1)
D[(n,t)] = x
return x
stones = [int(n) for n in sys.stdin.read().strip().split(" ")] stones = [int(n) for n in sys.stdin.read().strip().split(" ")]
print(count(stones, 25)) for times in [25,75]:
print(count(stones, 75)) print(sum(mutate(stone, times) for stone in stones))