Advent of code

 11 décembre 2024 

  Plutonian Pebbles : Transformer successivement une suite de nombres, qui croît en longueur de façon exponentielle.
5 127 680267  0 5851995
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.
  1. code.py
  2. code_part1_naif.py
  3. code_optim.py
  4. 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