◂ 11 décembre 2024 ▸
Plutonian Pebbles : Transformer successivement une suite de nombres, qui croît en longueur de façon exponentielle.
On part de 8 nombres, et à chaque étape, chaque nombre a un peu plus d'une chance sur deux de se dédoubler.
code_part1_naif.py
: Naïf, car met déjà 40 fois plus de temps que
code.py
pour la première partie, et terminerait sans doute la partie 2 après la fin de l'univers.
Une jolie partie cependant : l'utilisation de
divmod
, ainsi que le remplacement d'une valeur du tableau par deux autres en une seule ligne.
nb_digits = len(str(v))
if nb_digits % 2 == 0:
values[i:i+1] = divmod(v, 10**(nb_digits//2))
code_optim.py
, une petite optimisation de code.py
: Léger gain de temps si on ne wrappe pas les valeurs uniques dans un tuple.
- code.py
- code_part1_naif.py
- code_optim.py
- diff_optim.diffy
from functools import cache from functools import cache
with open("input.txt", 'r', encoding='utf-8') as f: with open("input.txt", 'r', encoding='utf-8') as f:
values = [int(token) for token in f.read().split()] values = [int(token) for token in f.read().split()]
@cache @cache
def change(v:int) -> tuple: | def change(v:int) -> int|tuple:
if v == 0: if v == 0:
return (1,) | return 1
nb_digits = len(str(v)) nb_digits = len(str(v))
if nb_digits % 2 == 0: if nb_digits % 2 == 0:
return divmod(v, 10**(nb_digits//2)) return divmod(v, 10**(nb_digits//2))
else: else:
return (v*2024,) | return v*2024
@cache @cache
def calc_len(v:int, n:int) -> int: def calc_len(v:int, n:int) -> int:
if n == 0: if n == 0:
return 1 return 1
return sum(calc_len(new_v, n-1) for new_v in change(v)) | new_v = change(v)
> if isinstance(new_v, int):
> return calc_len(new_v, n-1)
> else:
> return calc_len(new_v[0], n-1) + calc_len(new_v[1], n-1)
print("Réponse partie 1:", sum(calc_len(v, 25) for v in value print("Réponse partie 1:", sum(calc_len(v, 25) for v in value
print("Réponse partie 2:", sum(calc_len(v, 75) for v in value print("Réponse partie 2:", sum(calc_len(v, 75) for v in value