[Topique d'entraide] Le défi de Xuanwu
Posté le 24/09/2020 18:57
Bonjours à toutes et à tous, et bienvenue sur le topique d'entraide pour
le premier défi python du concours de rentrée 2020
Vous pouvez partager ici vos astuces, idées ou découverte, ou voir ce que les autres font. Rappelons tout de même que de poster directement des solutions est considéré comme de la triche et est donc
interdit (du moins c'était le cas il y a deux ans et aucunes idée pur cette année
)
Tout d'abord, le défi cette année semble être de guider à travers un labyrinthe une machine à coup de tourner à gauche/droite d'un angle θ et avancer. Pour avoir une participation valide, il faut compléter le labyrinthe, et pour gagner, faire ceci avec le minimum d'énergie/score (un peu de patience, j'y viens).
On a donc 3 fichiers à notre disposition:
- labytest.py qui sert à soumettre votre proposition
- polycalc.py qui permet d'uniformiser le dessin sur tous les modèles et floutant la limite entre la folie et le génie
- laby.py celui qui nous intéresse, contenant les fonctions de mouvement/calculs de score.
Maintenant que les banalités sont sous le tapis passons à la partie plus intéressante, celle ou je vous décortique le programme
Donc, il y a beaucoup de chose dans ce court fichier:
- De nombreuse fonction pour le hasard, elles servent à créer le labyrinthe afin qu'il soit généré procéduralement (mais comme tout le monde a la même seed minecraft, on a tous le même) pas grands chose à creuser de ce côté
- quelques fonctions de tracés, aucun commentaire.
Concentrons-nous à présent sur comment agir sur l'environnement:
- La foreuse est représentée par une liste de 7 nombres:
- X, Y, θ, une copie de X, une copie de Y, et score1, score2 et score3 (plus connues sous le nom
state[i] dans le code)
- Les fonctions tourner vont changer θ du nombre de radian indiqué dans le sens horaire (droite) ou anti-horaire (gauche).
- La fonction avancer va effectuer des pas en avant de 0.25 (selon l'angle θ actuel).
Enfin le score:
- Le score final est calculé en faisant score1 moins la division euclidienne de score2 par deux plus le sinus de score3(
score = scrore1 - score2//2 + sin(score3))
- Touner de θ augmente score1 par
5 +cout(θ) et de score3 de θ
- Avancer augmente score1 de
8+cout(l) et score3 de
l
- Avancer augmente score2 de 1 par pas de 0.25, soit de
4*l au total (et donc diminue le score final de
2*l ramené à l'entier inférieur)
- Si vous rencontrez un mur, score1 augmente de 15 et la fonction s'arrête (ne vous donnant pas vos points dans score2)
La fonction
cout est en fait la suivante:
def cout(a):
return len(str(round(abs(x)/1.,5)
Donc dans l'ordre:
-
abs met votre nombre a la valeur absolue
-
/1. convertie ce dernier en nombre a virgule
-
round ne garde que 5 chiffres après la virgule
-
str transforme le tout en chaine de caractères
-
len renvois la longueur de cette chaine de caractères
Ce que cela signifie, c'est que
score1 augmentera du nombre de caractères dans
a, mais:
- le potentiel signe moins est ignoré
- 1 est convertie en 1.0, donc niveau score c'est la même que 1.2
- les chiffres ne sont comptés que jusqu'à 5 place après la virgule
Enfin derniers détails:
-
score2 ne peut pas être plus grand que 200.
-
fix_angle(a) renvoi
a
Et voilà, c'est tout pour moi, la stratégie semble donc de faire les plus grandes lignes droites possibles avec le minimum de virages.
Sur ce bonne chance et que la meilleure gagne ♥
Citer : Posté le 25/09/2020 23:48 | #
Je veux pas balancer, mais Pavel a fait un script qui aide grandement à la résolution du problème
Citer : Posté le 26/09/2020 22:04 | #
Le problème de manque de fiabilité de la fonction cout() selon la plateforme d'exécution est normalement dès maintenant corrigé avec la v4 des scripts :
https://www.planet-casio.com/Fr/forums/topic16479-2-concours-de-rentree-2020-defi-python-de-xuanwu.html#178529
Sans pénaliser personne, bien au contraire.