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.
classRange: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)definvalid(self,repeat=2):ifself.len%repeat:return# longueur non divisible par le nb de répétitionsforrootinrange(int(self.sa[:self.len//repeat]),int(self.sb[:self.len//repeat])+1):ifself.a<=(v:=int(str(root)*repeat))<=self.b:yieldvdefall_invalid(self):forrepeatinrange(2,self.len+1):yield fromself.invalid(repeat)r=[]# ranges de même taille, eg 95-115 => 95-99, 100-115forrngindata:a,b=(int(_)for_inrng.split("-"))ta=awhileta<b:tb=min(int("9"*len(str(ta))),b)r.append(Range(ta,tb))ta=tb+1ex1=sum(vfor_inrforvin_.invalid())ex2=sum({vfor_inrforvin_.all_invalid()})
[^] # Re: Jour 2
Posté par Yth (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.