Ton algorithme ressemble beaucoup à l'algorithme en temps linéaire O(n) que j'ai obtenu.
Je fais plus ou moins la même chose mais où cells est une pile.
Je parcours ma liste de chiffres et pour chaque chiffre c, je retire du haut de ma pile tous les chiffres plus petits que c, si celle ci reste suffisamment grande pour qu'il reste 12 chiffres à la fin.
Ensuite je rajoute c à ma pile seulement si celle ci a moins de 12 éléments.
C'est bien en temps linéaire car chaque élément retiré de la pile ne le sera qu'une seule fois.
En pseudo-code ça donne
cells = []
pour chaque (i, c) de enumerate(ligne)
reste = taille(ligne) - i - 1
tant que cells n'est pas vide
c2 = dernier élément de cells
si c2 < c et taille(cells) + reste >= 12
retirer c2 de cells
sinon
break
si taille(cells) < 12
ajouter c à la fin de cells
renvoyer cells
mais comme je disais, c'est moins rapide (du moins, mon implémentation) que celle en 12 passes.
[^] # Re: Jour 3
Posté par Guillaume.B . En réponse au journal Advent of Code 2025. Évalué à 2.
Ton algorithme ressemble beaucoup à l'algorithme en temps linéaire O(n) que j'ai obtenu.
Je fais plus ou moins la même chose mais où
cellsest une pile.Je parcours ma liste de chiffres et pour chaque chiffre
c, je retire du haut de ma pile tous les chiffres plus petits quec, si celle ci reste suffisamment grande pour qu'il reste 12 chiffres à la fin.Ensuite je rajoute c à ma pile seulement si celle ci a moins de 12 éléments.
C'est bien en temps linéaire car chaque élément retiré de la pile ne le sera qu'une seule fois.
En pseudo-code ça donne
mais comme je disais, c'est moins rapide (du moins, mon implémentation) que celle en 12 passes.