• [^] # Re: jour 5

    Posté par . En réponse au journal Advent of Code 2025. Évalué à 1.

    Hello

    Perso, j'ai trouve l'exercice de ce jour presque plus facile que ceux des jours precedents.
    Je me suis bien embourbe un peu a vouloir gerer ca avec des sets, donc le plus long ce fut de kill mon process python pendant que sa conso memoire mettait mon systeme a mal.
    Au final, une solution assez similaire aux deux proposees plus haut a ceci pres que:

    • plus lourd car decompose en fonctions, dont parse_input et is_fresh qui sont lourdingues

    • usage de range plutot que tuple, pas sur que ca fasse une grande difference, si ce n'est que ca deplace la gestion des +1

    • un test un poil plus efficace pour l'exo 2 (a <= c ou t[0] <= r[0] sont inutiles, la liste etant triee :p)

    Ce qui donne:

    def parse_input(data: list[str]) -> tuple[list[range],list[int]]:
     fresh = []
     ingredients = []
     first = True
     for line in data:
     if line:
     if first:
     low, high = map(int, line.split('-'))
     fresh.append(range(low, high+1))
     else:
     ingredients.append(int(line))
     else:
     first = False
     return (fresh, ingredients)
    def is_fresh(ingredient: int, known_fresh: list[range]) -> bool:
     for r in known_fresh:
     if ingredient in r:
     return True
     return False
    def exo1(data: list[str]) -> int:
     fresh, check = parse_input(data)
     return sum([is_fresh(i, fresh) for i in check])
    def exo2(data: list[str]) -> int:
     fresh, _ = parse_input(data)
     fresh.sort(key=lambda r: (r.start, r.stop), reverse=True)
     r = fresh.pop()
     count = 0
     while fresh:
     next_r = fresh.pop()
     if next_r.start > r.stop:
     count += len(r)
     r = next_r
     else:
     r = range(r.start , max([r.stop, next_r.stop]))
     return count + len(r)

    ++
    Gi)