Bonjour
Pour commencer, rendons à césar ce qui est à césar, un grand merci à tous les organisateurs de ce concours et notamment pour tous le temps et l'énergie que vous y avez consacré. Ce fût un vrai plaisir de participer cette année.
Commençons donc mon odyssée vers mon score final (et ma 1er place hors groupe V601

),
J'étais dans ma petite période nostalgique où j'essayais temps bien que mal de remonter dans le classement du
défi turing. Défi que j'avais particulièrement try-hard quand j'étais en prépa.
Par une belle soirée où je m'acharnais encore sur l'un des problèmes du défi, une partie de mon cerveau me rappela l'existant d'un fameux concours de rentrée auquel je participais quand j'étais jeune, sur ti-planet. Ni une, ni deux, me voila revenu après quatre ans d'absence dans la compétition.
Petite lecture en diagonale du sujet puis, n'arrivant pas à trouver de version du scipt pyka3d pour ma magnifique et surpuissante ti-82, je me rabattis sur la version PC.
Ma première run fut catastrophique (en même temps, ce n'est pas surprenant quand on ne lit pas l'énoncé). Je commence donc part relire toutes les explications et à regarder comment le score est calculé.
Après un petit moment passé à comprendre le code dans les grandes lignes, je constate que le score augmente en touchant un pyka d'un niveau inférieur ou égal au notre avec un bonus maximal de 100 si le pyka est du même niveau.
N'ayant aucune vision de ce qu'il se passe dans le jeu, je commence par cartographier la carte à la main.
Ceci m'a ensuite permis de développer une fonctionnalité pour m'afficher la carte avec l'emplacement et le niveau des pyka.

J'ai directement utilisé les lettres de l'alphabet pour représenter les niveaux (A = niveau 1, B = niveau 2, ...) ceci m'a permis de représenter, sur un seul caractère, le niveau des pyka sur ma carte. Le seul inconvénient était de devoir faire la conversion quand vous parliez de niveau directement avec la valeur numérique.
L'avantage des mes lettres était que je n'avais plus qu'à suivre l'ordre alphabétique pour marquer de façon consécutive des +100 points.
Après avoir effectué quelques runs manuellement, je tombe rapidement sur un score supérieur à 1900. J'ai rajouté un petit saut à la fin de la liste d'action pour arrondir le score à 1900 piles et me voila donc 1er du classement le 2 octobre.
La réponse des autres participants, et notamment du mystérieux Inconnu 01, ne se fit pas attendre. En moins d'une heure, l'inconnu avait sorti un 1902 pour me reprendre ma 1er place.
Ce suivi une bataille de qui avait la plus grosse sur deux semaines (je remercie d'ailleurs cet inconnu, qui était finalement
Afyu, pour cette petite bataille pour la 1er place, c'était sympa)
Cet escalade m'a permit de développer différentes techniques pour augmenter de plus en plus mon score.
Je ne vais rien vous apprendre en disant que l'élément le plus embêtant dans l'histoire était le déplacement imprévisible des pyka. Ma stratégie était donc d'essayer de trouver un moyen d'avoir de bonnes conditions initiales de partie. L'objectif étant de pouvoir atteindre facilement le niveau 10 en début de partie pour sauter à l'étage.
La technique que j'ai utilisée était donc d'attendre un certain moment en début de partie, pour, qu'une fois arriver dans le château, je trouve une configuration favorable à mon évolution.
On peut retrouver des traces de cette technique dans mon code.
- Code: Select all
liste_actions = [5,-(3*pi/4 - 0.123200261),
4,774, #SEED
0, 206,...]
Les "seeds" que j'utilisais étaient trouvées directement par un script. L'objectif étant d'avoir un maximum de pyka de niveau consécutif dans la zone de début de partie pour pouvoir évoluer jusqu'au niveau 10 en ne marquant que des +100. Des bonnes seeds pouvaient ainsi me faire arriver dans le château avec des pykas de niveau 8 ou 9 dans le labyrinthe.
Je n'avais donc pas spécialement besoin de passer beaucoup de temps sur des fusions en début de partie. L'inconvénient de cette méthode, par rapport aux autres runs du groupe V601, est que j'arrive très tard dans le château, je dois donc avoir un score théorique maximum en début de partie plus faible. (Au passage, je n'ai pas développé de calculs de score maximum en fonction de l'action)
La suite de l'aventure, après avoir sauter à l'étage, était d'aller chercher les tours pour augmenter de niveau les pyka, tout en allant chercher des +100 dans la zone au pieds de la tour. Une fois les 4 petites tours activées (la tour du centre est surcôté), et le jardin vidé de ses occupants, je revenais dans le labyrinthe pour commencer les fusions des pykas restant. Cette méthode m'a permis d'arriver à un score de 2300. Apres une seconde tentative de cette stratégie, m'amenant encore une fois à un score de 2300, je laissa tomber un peu le concours par manque de temps (et un peu part flemme). J'étais arrivé à la fin de la première partie du principe de Pareto, où 80% du résultat est atteint avec 20% d'effort. Mon aventure dans le classement c'est donc arrêté avec mon 2308 (même pas un nombre rond

)
J'ai développé une fonctionnalité de sauvegarde de partie afin de reprendre instantanément une run à un point donné. Ceci me permettait d'optimiser facilement l'emplacement et la puissance de mes saut.
Quelques quêtes secondaires en bonus :
Bon, c'est bien beau de vouloir jouer de façon classique à pyka3d mais c'est quand même mieux si on arrive à casser le jeu (j'avais surtout peur qu'
Afyu découvre un bug cassant complètement le jeu)
Le facteur limitant d'une partie est trivialement le niveau du joueur, plus le niveau du joueur est élevé, plus il est difficile de marquer des +100. Nous pouvons donc aller chercher dans le code un moyen de réduire le niveau du joueur.
Après un petit ctrl+F "player[P_LEVEL] -= 1", on tombe rapidement dans la fonction levelup.
- Code: Select all
def levelup(player):
block_altitude_bottom, block_altitude_top = getBlockAltitudes(player[P_X], player[P_Y])
player[P_LEVEL] += 1
if player[P_Z] < block_altitude_top and player[P_Z] + player_height(player) > block_altitude_top:
player[P_LEVEL] -= 1
Cette fonction est appelée à chaque fois que le joueur rencontre un pyka, il est donc cruciale d'essayer de passer par la ligne 5 pour ne pas gagner de niveau une fois la fonction exécutée. Après un petite échange avec critor (vers le 12 octobre), il s'est avéré qu'un bug se cachait dans cette fonction. levelup(player) aurait du ressembler à ceci :
- Code: Select all
def levelup(player):
block_altitude_bottom, block_altitude_top = getBlockAltitudes(player[P_X], player[P_Y])
player[P_LEVEL] += 1
if player[P_Z] < block_altitude_bottom and player[P_Z] + player_height(player) > block_altitude_bottom:
player[P_LEVEL] -= 1
Initialement, le fait de pouvoir perdre un niveau était présent pour ne pas rester bloquer sous des escaliers. Du fait du bug qui ne permettait pas d'effectuer cette fonctionnalité, il n'était pas rare, dans les parties, de voir des pyka coinsés sous des escaliers.
J'ai effectué quelques runs avec le bug corrigé pour m'amuser un peu. J'ai pu aussi attendre très facilement un score de 1600 en étant toujours niveau 4 dans le labyrinthe. La stratégie étant d'amener un autre pyka niveau 4 sous la dernière marche accessible de l'escalier dans le labyrinthe. La fusion faisant augmenter la taille du joueur au dessus du plafond, la fonction levelup repassait automatiquement au niveau 4 pour ne pas être coincé, le +100 points étant, quant à lui, conservé. L'opération pouvait ainsi s'effectuer en boucle temps qu'on avait des pyka niveau 4.
Score équipe :
Vers le 25 octobre, la coalition V601 commençait à prendre forme, je me retrouvais donc l'un des rares joueurs sans équipe du classement. Histoire de ne pas rentrer dans l'équipe de mon rival inconnu 01, aka
Afyu, je fis ma demande à
cent20 pour rejoindre nsi4even. Vu que je n'avais plus spécialement l'envie de jouer à pyka3D, j'ai pu passer la fin du concours à essayer de maximiser le score de la nsi4ever afin d'être au moins 1er dans un classement cette année (spoiler : bah c'est raté). Je tiens quand même à remercier les membre de nsi4ever de m'avoir accueilli. La configuration à 5 membre d'équipe étant d'ailleurs la meilleur configuration qu'on pouvait m'offrir au vu du calcul de score d'équipe. En effet, des bonus apparaissent uniquement au paliers des 3, 5 et 8 joueurs. Je ne me suis pas amusé à faire une démo mais je pense que 5 est le meilleur nombre de joueur dans une équipe.
L'ordre de soumissiont est exctrèmenent important pour maximiser le score d'équipe. Prenons l'exemple de nsi4ever. Nous avons marqué au finale 3950 points. En prendant la pire organisation, nous pouvions perdre plus de 800 points et arriver à 3114.
Si nous prenons nos amis du groupe V601, leurs score d'équipe de 4317 peut être amélioré en faisant un peu de ménage dans les rangs. On peut ainsi attendre 4517 en retirant les score de
Tiny_Hacker et d'
Hackcell. La configuration à 5 est tellement puissante que V601 pouvait même attendre 4112 en retirant le score d'
Afyu et de
Max1m3. (donc oui, dans tous les cas nsi4ever l'éternel second)
Un grand merci à
cent20 et à ses élèves pour s'être organisés sur l'envoi des scores

De mon côté, je vous dit à l'année prochaine (si je n'oublie pas), d'ici là, j'ai encore 2 3 problèmes du
défi turing à finir.
Pour le lot, je vais me contenter d'un lot CX2CAS (je ne connaissais pas l'existence de la N0120EX avant le concours donc ce lot me va très bien quand même

)
- 1 calculatrice TI-Nspire CX II-T Ndlessable
- 1 kit de géométrie Calcuso
- 1 pack de goodies TI :
- 1 adaptateur pour périphériques USB
- 1 clavier USB noir
- 1 porte-clésTI (celui où la calculatrice fait un câlin à pi)
- 1 autocollant TI (celui avec I love pi)
- 1 coffret de 3 casse-têtes TI
- 1 stylo TI (pas de choix spécifique)
- 1 paire de chaussettes TI-84 Plus CE
- 1 pack de goodies Xcas :
- 1 autocollant Xcas
- 1 aimantin Xcas
- 1 pack de goodies TI-Planète Casio :
- 1 aimantin TI-Planet (logo ti planète classique sur fond blanc)
- 1 autocollant TI-Planet au choix (logo ti planète classique sur fond blanc)
- 1 autocollant Planète Casio
Je cède le reste du lot à
cent20 si ça l'intéresse