day 11, rewrite for codon, get 10x speedup
This commit is contained in:
parent
dd493270fd
commit
2e38177e92
31
d11/run.py
31
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))
|
||||
|
|
Loading…
Reference in New Issue