• [^] # Re: Jour 2

    Posté par (Mastodon) . En réponse au journal Advent of Code 2025. Évalué à 2.

    J'ai adopté une approche qui consiste à regarder les valeurs possibles en fonction de la première partie de l'identifiant (par exemple pour 1188511880-1188511890 exercice 1 on a uniquement 11885, mais pour 111200-222200, avec 3 répétitions on aurait tout dans [11-22]).
    Je les multiplie par le nombre de répétition (ici ça donne 1188511885, ou 111111, 121212, ..., 222222), et on vérifie si le nombre est dans l'intervalle.

    Pour simplifier, je redécoupe les intervalles où les nombres n'ont pas la même taille, par exemple je remplace 95-115 par 95-99 et 100-115, au début.
    Après pour l'exercice 1 on regarde que sur les nombres répétés deux fois, et pour l'exercice 2 on teste toutes répétitions de 2 à longueur.

    Pour l'exercice 2 il faut dédupliquer, par exemple 222220-222224 donne 222222 pour 222|222, 22|22|22 et 2|2|2|2|2|2.

    class Range:
     def __init__(self, a, b):
     self.sa, self.sb = str(a), str(b)
     self.a, self.b = int(a), int(b)
     self.len=len(self.sa)
     def invalid(self, repeat=2):
     if self.len%repeat: return # longueur non divisible par le nb de répétitions
     for root in range(
     int(self.sa[:self.len//repeat]),
     int(self.sb[:self.len//repeat])+1):
     if self.a <= (v:=int(str(root)*repeat)) <= self.b:
     yield v
     def all_invalid(self):
     for repeat in range(2, self.len+1):
     yield from self.invalid(repeat)
    r=[] # ranges de même taille, eg 95-115 => 95-99, 100-115
    for rng in data:
     a, b = (int(_) for _ in rng.split("-"))
     ta = a
     while ta < b:
     tb = min(int("9"*len(str(ta))), b)
     r.append(Range(ta, tb))
     ta = tb+1
    ex1 = sum(v for _ in r for v in _.invalid())
    ex2 = sum({v for _ in r for v in _.all_invalid()})
    • Yth.