◂ 2 décembre 2025 ▸
Gift Shop : Trouver des nombres qui sont composés exactement d'un pattern qui se répète (ABCABCABCABC par exemple).
17330-35281,9967849351-9967954114, … ,16048379-16225280
La partie 1 se fait facilement.
La partie 2 se fait facilement avec des Regexp et en passant en revue chaque nombre de l'intervalle ; cela prend en revanche 2 secondes pour tout faire.
Il est possible de calculer directement la somme des nombres sans tout passer en revue.
Par exemple, entre 3519 et 8342, il y a 3535, 3636…, 8282. Il suffit donc de compter la somme des nombres de 35 à 82, puis de multiplier par 101.
La difficulté arrive lorsqu'il y a plusieurs divisions du nombre possibles, par exemple pour 6 chiffres: ABABAB et ABCABC, qui va compter à double les AAAAAA. Il faut donc faire une correction avec un principe d'inclusion-exclusion pour supprimer les doublons. Ce code avec formule est beaucoup plus rapide.
- code_part1.py
- code_regexp.py
- code_formule.py
ranges = []
with open("input.txt", 'r', encoding='utf-8') as f:
for line in f.read().strip().split(','):
ranges.append(line)
# Pour partie 1, plus rapide que regexp
def invalid_part1(i):
s = str(i)
if len(s) % 2 == 1:
return False
k = len(s) // 2
return s[:k] == s[k:]
rep1 = 0
for r in ranges:
start, end = r.split('-')
for i in range(int(start), int(end)+1):
if invalid_part1(i):
rep1 += i
print("Réponse partie 1:", rep1)