Pour le problème du jour, j'ai anticipé la partie 2 et j'ai donc préparé directement un truc efficace pour cette partie.
A chaque itération de blink, je stocke un HashMap qui associe à chaque valeur (pierre) le nombre d’occurrences de cette valeur.
Quelques optimisations:
- j'alloue un hashmap d'une capacité double de la taille du précédent arrangement.
Ca évite de réallouer le hashmap quand celui ci grossit.
- J'utilise la librairie ahash comme fonction de hash à la place de celle par défaut,
ce changement a quasiment divisé le temps d'exécution par 2.
- Pour calculer les deux parties des chiffres d'un nombre, j'utilise la méthode ilog10 ainsi qu'une division et un modulo plutôt que convertir le nombre en string et le reconvertir en entier.
Je pense que ça aurait été encore plus rapide en faisant plein de if pour chaque puissance de 10 mais ça aurait été très moche.
J'ai essayé d'utiliser des u32 au lieu de u64 comme clé du hashmap mais j'ai des overflows. Par contre, je n'ai pas eu besoin d'utiliser de big integers.
Du coup, un peu moins de 3ms: partie 1 + partie 2.
[^] # Re: 11ème jour
Posté par Guillaume.B . En réponse au journal Advent of code 2024. Évalué à 2.
Pour le problème du jour, j'ai anticipé la partie 2 et j'ai donc préparé directement un truc efficace pour cette partie.
A chaque itération de blink, je stocke un HashMap qui associe à chaque valeur (pierre) le nombre d’occurrences de cette valeur.
Quelques optimisations:
- j'alloue un hashmap d'une capacité double de la taille du précédent arrangement.
Ca évite de réallouer le hashmap quand celui ci grossit.
- J'utilise la librairie
ahashcomme fonction de hash à la place de celle par défaut,ce changement a quasiment divisé le temps d'exécution par 2.
- Pour calculer les deux parties des chiffres d'un nombre, j'utilise la méthode ilog10 ainsi qu'une division et un modulo plutôt que convertir le nombre en string et le reconvertir en entier.
Je pense que ça aurait été encore plus rapide en faisant plein de
ifpour chaque puissance de 10 mais ça aurait été très moche.J'ai essayé d'utiliser des
u32au lieu deu64comme clé du hashmap mais j'ai des overflows. Par contre, je n'ai pas eu besoin d'utiliser de big integers.Du coup, un peu moins de 3ms: partie 1 + partie 2.