Aujourd'hui , on brave le blizzard. Il faut aider les elfes à traverser les blizzards qui parcours la plaine.
https://adventofcode.com/2022/day/24
'''
With everything replanted for next year (and with elephants and monkeys to tend the grove), you and the Elves leave for the extraction point.
Partway up the mountain that shields the grove is a flat, open area that serves as the extraction point. It's a bit of a climb, but nothing the expedition can't handle.
At least, that would normally be true; now that the mountain is covered in snow, things have become more difficult than the Elves are used to.
As the expedition reaches a valley that must be traversed to reach the extraction site, you find that strong, turbulent winds are pushing small blizzards of snow and sharp ice around the valley. It's a good thing everyone packed warm clothes! To make it across safely, you'll need to find a way to avoid them.'''
# Parcours en largeur.
Posté par syj . Évalué à 5.
On est dans le cas typique d'un parcours en largeur d'un arbre des possibles.
A chaque round, on regarde l'ensemble des actions possibles et on calcule les états suivants en fonction de ses possibilités
il y a des branches qui s'élimine d'elle-même car il n'y a plus d'action possible pour le joueur.
il y aussi des branches qui se rejoingne car il y a plusieurs chemin pour arriver à un même état.
J'utilise le hashCode/equals de mon State pour les dédupliquer sinon çà explose grave.
Au total,j'ai mis 1h50 pour debug les différentes conneries que j'ai fait à mon réveille.
Je mets 40s pour calculer la solution de la 2ème étoiles
Maintenant, je vais aller braver les magasins car j'ai plein de cadeau à acheter :-).
Joyeux Noël à tous.
# Sympa
Posté par Eric P. . Évalué à 4.
Bien joue!
Ma solution prend:
epignet@dell> time bin/pypy 2022/day24.py
trip1=249 trip2=246 trip3=240 (trip1+trip2+trip3)=735
bin/pypy 2022/day24.py 5.65s user 0.07s system 99% cpu 5.748 total
5.65s pour la partie 2.
J'utilise une liste de dictionaires pour ma grille, le dictionnaire etait le nombre de chaque caractere dans la case.
J'utilise un deque pour mon BFS.
Ce que j'ai fait pour optimiser au maximum, c'est:
python -m cProfile 2022\day24.py
qui ma dit que c'etait ma fonction qui retourne les cases libres autour de moi, qui etait la ou je passais le plus de temps. Du coup j'ai precalcule si chaque case etait libre au moment de mettre a jour les blizzards, pour ne pas avoir a le faire pour chaque essai.
Chaque essai consiste juste a est verifier les cases libres autour de soi et ajouter a un deque, ce qui est ultra rapide si les cases libres sont precalculees.
J'ai fait la partie 2 apres le repas de reveillon - eh oui il est 21:46 a Sydney a l'heure ou j'ecris, c'est peut-etre les quelques verres de Champagne qui m'ont fait un peu galerer sur un bug bete (je recalculais la grille une fois de trop apres chaque trajet) mais la partie 2 n'ajoutait pas de difficulte.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
# Belle modélisation, rapide, efficace.
Posté par Yth (Mastodon) . Évalué à 4.
Je suis fier de moi !
Bon, j'ai pu démarrer très tard aujourd'hui, mais j'ai été efficace et j'ai fait du joli code, court et propre.
Une bête erreur de préparation a flingué ma perfection, pour le calcule des 4 directions de mouvements, j'avais fait
droite, gauche, bas, gauche
… Et les données de test passent : ya jamais besoin d'aller en haut pour trouver la bonne solution, rhaaa !Bref, j'ai relu, j'ai trouvé, et j'ai passé à peine quelques minutes entre le 1 et le 2, le temps de mettre le code d'itération dans une fonction avec une position de départ et une d'arrivée, et de l'appeler trois fois d'affilé.
Exécution en 1,5 secondes.
Utilisation extensives des set(), union, intersection.
J'ai aussi eu une flemme terrifiante de calculer un PPCM, alors il est mochement en dur dans le code, comme quoi tout n'est pas si beau ^
L'état du terrain avec ses tornades est cycliques en PPCM(largeur, hauteur), donc je calcule tous les états possibles au début et je me balade après en faisant tourner le
deque
.L'initialisation est presque plus longue que la solution…
[^] # Re: Belle modélisation, rapide, efficace.
Posté par Eric P. . Évalué à 1. Dernière modification le 24 décembre 2022 à 23:36.
J'aime beaucoup ta solution en effet. Joli et super efficace!
Chez moi aussi, c'est le calcul des grilles qui est plus long que la solution. Vu qu'il n'etait execute que moins de 300 fois par trajet, je n'ai pas cherche a l'optimiser. La ou je passe le plus de temps c'est pendant le deepcopy de ma grille avant de commencer la suivante.
Justement j'ai beaucoup ton calcul de grilles. A la place de looper sur les etats et mettre a jour la grille complete, tu calcules chaque blizzard pour chaque etat, et ensuite tu zippes tout ca avec l'unpacking operator.
Le PPCM par contre ne te fait pas gagner tant que ca vu qu'il n'est pas beaucoup plus petit que le nombre complet d'etats a connaitre.
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: Belle modélisation, rapide, efficace.
Posté par Yth (Mastodon) . Évalué à 3.
Le PPCM ça me permet juste d'avoir une modélisation complète directement, et plus un calcul après.
Je t'assure qu'avec mon bug initial où on n'allait jamais vers le haut, on fait défiler les rounds, le temps de relire le code, c'est plus de 100 000 qui sont passés à tourner en rond sur un cycle de 600, logique 😅
Bref, ça permet un plantage très performant !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.