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
""" Math interpolation version
    See Mathologer's video https://www.youtube.com/watch?v=4AuV93LOPcE """

f = open("input.txt", 'r', encoding='utf-8')
lines = [list(map(int, line.split())) for line in f.readlines()]

NB_VALUES_IN_SEQ = len(lines[0])
assert all(len(line) == NB_VALUES_IN_SEQ for line in lines)

def calc_pascal_triangle_coeffs(row_number):
    coeffs = [1]
    value = 1
    for i in range(row_number):
        value = value * (row_number - i) // (i+1)
        coeffs.append(value)
    return coeffs

pascal_triangle_coeffs = calc_pascal_triangle_coeffs(NB_VALUES_IN_SEQ)

def interpolate(seq: list[int]) -> int:
    global NB_VALUES_IN_SEQ, pascal_triangle_coeffs
    return sum( (-1)**i * coeff * seq[i]  for (i, coeff) in enumerate(pascal_triangle_coeffs[1:]) )
        
print("Part 1:", sum(interpolate(line[::-1]) for line in lines))
print("Part 2:", sum(interpolate(line) for line in lines))