Suite de l'Avent du Code, jour 9.
Ça y est, nous sommes vraiment en route dans la forêt. Il y a un pont de singe à traverser, mais si les lutins sont bien passés il n'est en revanche pas certain qu'il supporte l'embonpoint du Père Noël. Ce dernier doit donc calculer des trajectoires de cordes obéissant à la métrique associée à la distance de Tchebychev. Logique.
# En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
J'aurais bien aimé éviter d'énumérer tous les cas de mouvement de suivi, mais je n'ai rien trouvé d'astucieux pour éviter cela.
J'espère que dans vos solutions perso, vous aurez pensé à utiliser, en arrivant à la deuxième partie, à utiliser une seule corde pour simuler les deux…
[^] # Re: En Python, modélisé
Posté par Eric P. . Évalué à 2. Dernière modification le 09 décembre 2022 à 13:56.
C'est pas tres joli non plus, mais on peut utiliser getattr/setattr pour factoriser la meme operation cote x et y dans la fonction de suivi:
Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.
[^] # Re: En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
Ce serait sans doute plus joli avec des coordonnées indexées (une liste de coordonnées en somme) plutôt que nommées.
Mais ce n'est de toute façon pas très compréhensible, de cette façon-là.
[^] # Re: En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3. Dernière modification le 09 décembre 2022 à 16:58.
Bon, en fait, pas besoin d'énumérer de façon aussi laborieuse bien sûr :
[^] # Re: En Python, modélisé
Posté par Yth (Mastodon) . Évalué à 4.
Pas lors de la première résolution, mais après en nettoyant un peu le code oui… Comme d'hab, le problème arrivant en deux fois, on n'optimise pas dès le début pour la seconde partie :)
Voici mon code :
Pas trop modélisé, des vecteurs numpy juste pour avoir des simplifications comme l'addition, la soustraction ou la valeur absolue.
J'aime bien ton
import_line
qui fait un unique itérateur pour chaque mouvement unitaire, c'est propre !Et donc :
[^] # Re: En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4. Dernière modification le 09 décembre 2022 à 18:05.
Tu peux te passer de la position initiale dans l'ensemble des positions visitées : après le premier mouvement, la queue de la corde y sera toujours.
[^] # Re: En Python, modélisé
Posté par Yth (Mastodon) . Évalué à 3.
C'est vrai !
Bon, comme j'aime bien les trucs rigolos qui bougent, j'ai fait une animation en terminal.
On ajoute ça :
Et dans la boucle on ajoute à la fin :
d(knots)
J'ai 11460 mouvements dans mon input, à cette vitesse -
sleep(.01)
- ça prends 2 minutes et quelques.Ça commence centré sur le démarrage, et quand la tête déborde d'un côté, on translate tout pour garder dans le champs.
[^] # Re: En Python, modélisé
Posté par steph1978 . Évalué à 3.
J'adore l'animation !
Pour limiter les glitches, j'ai ajouté
print("\033[0;0H", end='')
au début du__call__
.Ça replace le curseur la coordonnée (0,0) du terminal ce qui évite le scrolling.
Dans la même veine, il est bénéfique de cacher le curseur avec
tput civis
avant de lancer l'animation. À la fin de l'animation, le remettre avectput cnorm
[^] # Re: En Python, modélisé
Posté par Yth (Mastodon) . Évalué à 3.
Bonne idée de remettre le curseur en haut !
Et encore une petite amélioration inutile donc indispensable :
On a un fond en échiquier, qui bascule quand on « déplace la caméra », ça permet de visuellement voir que ça défile.
Ça marche parce qu'on décale toujours de 1, et ça alterne entre les deux fonds quelle que soit la direction du déplacement.
Et avec des caractères utf-8 de bloc plein, ou gris, c'est plus joli.
[^] # Re: En Python, modélisé
Posté par steph1978 . Évalué à 2.
Splendide !
J'ai réutilisé l'idée de l'utf8 pour le jour 10 aussi. La lecture du LCD est infiniment plus facile, plus besoin de plisser les yeux pour deviner les lettres.
Pour l'animation de la corde j'ai choisis d'afficher le numéro du noeud (0 à 9) en noir sur fond jaune ; et de déplacer la caméra de 19 d'un coup. J'aimais pas trop la voir manger le mur :). J'ai aussi géré les largeurs impaires, c'est le cas de mon terminal.
[^] # Re: En Python, modélisé
Posté par Yth (Mastodon) . Évalué à 2.
C'est Tanguy qui a pensé à l'utf8 en premier pour le jour 10, je reprends les bonnes idées :)
[^] # Re: En Python, modélisé
Posté par steph1978 . Évalué à 2.
Ah exacte, ligne 1527 et 1529 de son programme 😇
[^] # Re: En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
Eh oh, je sais que j'écris du code-fleuve, mais pas la peine de se moquer non plus !
[^] # Re: En Python, modélisé
Posté par steph1978 . Évalué à 2.
Je me moque gentiment. Tu as affiché clairement ton envie de faire du code propre, modélisé, typé. Et c'est louable.
Moi je pense avoir affiché mon objectif : peut importe le moyen pourvu qu'on ait la réponse le plus vite possible :)
# Coin coin
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 4.
Le problème parle de corde à nœuds, mais m'évoquerait plutôt une canne et ses canetons, pas vous ?
# Ma solution
Posté par GaMa (site web personnel) . Évalué à 3.
Et voici ma solution. Et sans énumérer tous les cas de mouvement de suivi<
Matthieu Gautier|irc:starmad
# pfiu
Posté par steph1978 . Évalué à 3.
J'ai fait la première partie en AWK en une petite demie heure.
J'ai eu pas mal de chance car mes calculs étaient approximatifs mais suffisant pour le cas à un noeud.
En voyant la seconde partie, j'ai tout ré-écrit en python car j'y ai vu un truc récursif.
J'ai pigé assez vite qu'il fallait mieux faire toutes les étapes, case par case pour tous les neouds.
Ça donnait toujours le bon résultat pour le premier noeud mais pas pour le dernier.
J'ai mis vraiment beaucoup de temps à débugger en pas à pas et ajuster mes calculs. Plusieurs heures :(
Pour au final un code très impératif que j'aurai presque pu laisser en AWK.
Bref dur ce jour pour moi
part 1
part 2
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.