Advent of code

 5 décembre 2023 

  If You Give A Seed A Fertilizer : Faire des correspondances de nombres sur de larges intervalles qui se chevauchent
seeds: 364807853 408612163 302918330
   
  
   
seed-to-soil map:
   
2069473506 3732587455 1483883
   
3235691256 2348990120 6550341
   
                  ⋮   
  
   
soil-to-fertilizer map:
   
2700214958 2743391193 363795571
   
                  ⋮   
humidity-to-location map:
   
                  
  1. code1.py
  2. code2.py
  3. code2_oo.py
  4. code2_oo_nonRecursif.py
  5. intervalle.py

        
""" Version non récursive, plus besoin de deux fonctions différentes
    20% plus rapide que la version OO récursive. """

def calculer_intervalles_suivants(regles: Transformation, intervalles: list[Intervalle]) -> list[Intervalle]:
    intervalles_calcules = []
    intervalles_a_traiter = intervalles
    for intervalle_regle, decalage in regles:
        new_inter_a_traiter = []
        for intervalle in intervalles_a_traiter:
            intersection = intervalle & intervalle_regle
            if intersection.est_vide():
                new_inter_a_traiter.append(intervalle)
            else:
                intervalles_calcules.append(intersection.decale(decalage))
                new_inter_a_traiter.extend(intervalle - intersection)
        intervalles_a_traiter = new_inter_a_traiter
    intervalles_calcules.extend(intervalles_a_traiter)
    return list(intervalles_calcules)


intervalles = seeds_intervalles

for regles in transformations:
    intervalles = calculer_intervalles_suivants(regles, intervalles)