150 microsecondes pour la partie 1 et 600 microsecondes pour la partie 2.
La partie 1 est facile, passons.
J'ai rapidement eu l'idée pour la partie 2 mais j'ai galéré à débugger mon code.
Je ne suis pas très satisfait de mon code, je pense qu'il peut être simplifié.
L'idée est de considérer des ensembles de RatingRange deux à deux disjoints.
Les RatingRange étant des intervalles de valeurs pour chaque évaluation (x, m, a ou s).
On peut voir ça comme un rectangle en 4 dimensions.
On démarre avec un ensemble composé d'un seul RatingRange avec x = [1..4000], m=[1..4000], a=[1..4000] et s=[1..4000]
A chaque test effectué, on va séparer les RatingRange en deux catégories, ceux qui sont acceptés et ceux qui sont refusés. Pour cela, on devra parfois diviser un RatingRange en deux parties.
C'est ce que fait la fonction suivante haskell
splitRatings :: Test -> [RatingRange] -> ([RatingRange], [RatingRange])
A partir de là, il est relativement facile de simuler les worflow en prenant en entrée des RatingRange et de calculer le nombre total de possibilités de pièces vu que les RatingRange sont deux à deux disjoints.
# Solution en Haskell.
Posté par Guillaume.B . En réponse au message Advent of Code, jour 19. Évalué à 2. Dernière modification le 19 décembre 2023 à 13:07.
150 microsecondes pour la partie 1 et 600 microsecondes pour la partie 2.
La partie 1 est facile, passons.
J'ai rapidement eu l'idée pour la partie 2 mais j'ai galéré à débugger mon code.
Je ne suis pas très satisfait de mon code, je pense qu'il peut être simplifié.
L'idée est de considérer des ensembles de
RatingRangedeux à deux disjoints.Les RatingRange étant des intervalles de valeurs pour chaque évaluation (x, m, a ou s).
On peut voir ça comme un rectangle en 4 dimensions.
On démarre avec un ensemble composé d'un seul RatingRange avec
x = [1..4000], m=[1..4000], a=[1..4000] et s=[1..4000]A chaque test effectué, on va séparer les RatingRange en deux catégories, ceux qui sont acceptés et ceux qui sont refusés. Pour cela, on devra parfois diviser un RatingRange en deux parties.
C'est ce que fait la fonction suivante
haskellsplitRatings :: Test -> [RatingRange] -> ([RatingRange], [RatingRange])
A partir de là, il est relativement facile de simuler les worflow en prenant en entrée des RatingRange et de calculer le nombre total de possibilités de pièces vu que les RatingRange sont deux à deux disjoints.
Voici le code en entier.