Advent of code

 9 décembre 2023 

  Mirage Maintenance : Interpoler des séquences par dérivée discrète
9 10 20 47 106
   
1 -2 10 50 131
   
19 29 47 83 149
   
        
  1. code.py
  2. codeDevantDerriere.py
  3. codeMath.py
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

def derivee_discrete(suite: list[int]) -> list[int] :
    return [ suite[i] - suite[i-1]  for i in range(1, len(suite)) ]

def is_suite_constante(suite: list[int]) -> bool:
    return all(v == suite[0] for v in suite)
    # Encore plus simple pour vérifier si suite de 0:    return not any(suite) 

def interpoler(suite: list[int]) -> list[int]:
    suites = [suite]
    while not is_suite_constante(suites[-1]) :    # une suite constante suffit, pas besoin d'aller jusqu'à 0, 0, 0,…  
        suites.append( derivee_discrete(suites[-1]) )

    while len(suites) > 1:
        last_line = suites.pop()
        suites[-1].append(suites[-1][-1] + last_line[-1])
    return suites[0]

lines = [list(map(int, line.split())) for line in lines]
print("Réponse partie 1:", sum(interpoler(line)[-1] for line in lines))

# Pas besoin de faire le travail à l'identique en début de suite: on continue à le faire à la fin sur les suites retournées !
print("Réponse partie 2:", sum(interpoler(line[::-1])[-1] for line in lines))