REX : Mon premier challenge Codingame

REX : Mon premier challenge Codingame
11 / 05 / 2021Temps de lecture 5 min.
FacebookLinkedInTwitter

Codingame est principalement un site d’entraînement au langage de programmation utilisé par les recruteurs. Mais il ne se limite pas seulement à cet univers de test et d’évaluation. Il existe également un système de challenge qui m’était jusque-là complètement inconnu. 

Pendant une semaine entière, un défi est relevé par la communauté. Le but ? Des bots/robots codés par les participants s’affrontent par niveaux ou ce qu’on appelle des ligues (bois, bronze, argent, or, legend).

Codingame, qu’est-ce que c’est ? 

Idée reçue

Codingame était déjà passé dans mon radar mais je n’avais, à l’époque, pas été convaincu par ses puzzles games servant principalement à tester nos compétences en langage de programmation. Mon avis a bien évolué et a dépassé cette idée préconçue que je m’en étais faite.

Le hasard d’une rencontre

Le hasard fait bien les choses car durant une de mes missions j’ai été amené à rencontrer une équipe de “vétérans” de Codingame. Ils m’ont alors présenté un plus large éventail des possibilités du site, avec des défis plus aboutis.

Les avantages

L’idée de pouvoir coder un bot pour un jeu compétitif en python était pour le moins séduisante. Surtout que le site a eu la bonne idée de proposer les librairies de nos jours indispensables : numpy et pandas.

Mise en place

Après cette redécouverte de la plateforme, je me suis joint à leur équipe pour participer quelques jours plus tard au Fall Challenge 2020.

Ce challenge d’une semaine a pour thème un jeu de plateau physique qui a, pour l’occasion, été codé par les équipes de Codingame.

“Le jeu se déroule dans un magasin de potions dans lequel se trouvent deux sœurs jumelles sorcières, chacune tentant de prouver qu’elle est plus douée que l’autre dans la préparation de potions. Elles ont organisé un petit concours : gagner plus de rubis que sa sœur en vendant des potions. Cependant, la hutte de sorcière où est situé leur magasin n’est pas très grande, elles doivent partager le même espace de travail et gérer les mêmes commandes. “

“Chaque joueur contrôle une sorcière. Chaque sorcière a accès à son propre inventaire d’ingrédients ainsi qu’à une liste de sorts qu’elle a appris. Ces sorts sont utilisés pour transformer un ensemble donné d’ingrédients en un autre.Chaque commande est une liste d’ingrédients nécessaires pour préparer une potion et gagner des rubis. Une partie se déroule sur plusieurs tours. À chaque tour, les joueurs effectuent une action simultanément.

Ingrédients : Il y a 4 types d’ingrédients, de valeur croissante. Les types sont indexés de 0 à 3” (source : Codingame).

Pour plus de renseignements sur les règles du jeu vous pouvez consulter cette vidéo de tutoriel (en anglais).

Déroulé du challenge

L’interface

L’IDE de Codingame : à droite la partie code qui est auto-remplie avec les informations essentielles pour récupérer les inputs et générer les outputs ; à gauche la fenêtre du jeu qui permet de suivre les parties étapes par étapes ainsi qu’une fenêtre de débogage.

Les ligues

Après avoir testé son bot contre une IA, on lance une série d’affrontements contre les autres participants pour calculer son score au sein d’une ligue (bois, bronze, argent, or et legend), qui s’achève contre un boss.
Si l’on est victorieux, on passe dans une ligue supérieure (si celle-ci est débloquée). L’ensemble des ligues n’est pas accessible dès le départ mais se débloque à un rythme d’une tous les 2 jours. À noter qu’une nouvelle ligue apporte de nouvelles règles. 

Il y a donc dans cette compétition un système régulier de validation pour passer à des niveaux plus élevés, ce qui donne l’occasion de perfectionner son code et discuter stratégie avec son équipe. D’où l’intérêt d’en avoir une !

Se familiariser avec les règles du jeu

Au début même les experts utilisent python ou un autre langage permettant de prototyper rapidement et se familiariser avec les règles et l’interface. Chaque challenge ou puzzle impose un format spécifique aux inputs et outputs, même si l’interface reste la même. Ce passage est le plus déroutant pour un novice.
Heureusement une fenêtre de log permet de comprendre étape par étape le résultat de notre algorithme.

Évolution des règles

Comme dit précédemment, l’avancement se décompose en ligues. L’évolution dans les premières ligues se fait assez rapidement. Mais tout se complique lorsque les ligues se débloquent avec l’ajout de nouvelles règles. 

Exemple : à partir de la ligue argent, un système d’achat de sort à contester avec l’adversaire est mis en place. Si on n’a pas adopté des bonnes pratiques de code en début de challenge ces ajouts peuvent obliger à tout réécrire.

 

Quelques conseils pour bien commencer !

  • De bonnes pratiques de code sont très efficaces pour ne pas perdre de temps.
  • Bien choisir son algorithme : a priori partir au plus simple quitte à brader les performances et le faire évoluer en fonction des nouvelles règles de jeu.  
  • Les performances : chaque boucle de calcul ne doit pas dépasser 80 ms, dans la précipitation j’ai oublié que les performances de la bibliothèque pandas sont très inférieures à celles de numpy.
  • Visionner les derniers matchs de notre bot mais également des adversaires, on peut par exemple “charger” un bot pour s’entraîner contre lui. 
  • Une semaine est un temps très court, il faut s’appuyer sur son équipe pour avancer rapidement sur les stratégies et les choix algorithmiques.
  • Ne pas hésiter à copier les données d’entrée dans son IDE préféré (pour moi  un notebook) et tester des fonctionnalités pour accélérer le débogage.
Interface pour visualiser nos derniers combats. Elle se paye le luxe d’avoir un système de replay intégré.

Aller plus loin

Score officiel

À la fin du challenge j’ai terminé en ligue argent malgré de mauvaises performances du code et une prédiction de l’algorithme avec seulement 3 coups d’avance. 

Ce challenge était plutôt compliqué si on compare mon score avec celui de mes collègues plus expérimentés que moi. Cela est surtout dû aux changements de règles, comme l’achat de sort, qui oblige à décomposer notre algorithme en 2 phases lors d’une partie.
Même si l’exercice demande beaucoup de temps pour espérer être performant, l’expérience est addictive !

Je décide de continuer en me fixant comme objectif le rang or… Puis quelques jours plus tard le rang legend.

Challenge en solitaire

Même le challenge officiellement terminé, les bots des participants continuent de s’affronter. On peut donc continuer à s’entraîner pour améliorer son score. 

Cette première expérience ajoutée aux informations récoltées dans les post mortems des participants m’a permis de mettre en place une approche beaucoup plus efficace. Je m’étais d’ailleurs fixé un autre challenge personnel : concurrencer des langages plus bas niveau avec python.

  • Création d’un simulateur simplifié du jeu en python à partir des données d’entrée (liste des potions et recettes).
  • Un code pour tester différents hypers paramètres lié à l’algorithme. 
  • Un nouvel algorithme de recherche en faisceau, le Beam search, plus performant (beam Search https://en.wikipedia.org/wiki/Beam_search).
  • Adapter mon code pour prédire les coups de l’adversaire.

Événement marquant

Si je devais ne citer un événement marquant, ce serait celui de mon passage contre le boss entre les ligues or et legend. Sa puissance/son score dépend également de ses victoires contre les autres participants. Après la semaine officielle, il a tellement gagné en puissance qu’il était loin devant les autres participants. Je restais systématiquement à la seconde place juste derrière lui… Frustrant.
Pour le vaincre  ma stratégie fut donc de faire varier les hyperparamètres de mon modèle  en fonction de sa stratégie et de relancer le fil des combats toutes les 15 minutes. Pas très subtil mais quelle satisfaction quand j’ai finalement atteint le rang légende !

Conclusion

En conclusion, ce type de challenge est addictif et j’ai personnellement atteint mes objectifs, voire plus en accédant au rang légende. En bonus je suis également arrivé dans les premiers sur les participants avec le langage python. 

Grâce à une méthode orienté numpy mon code a pu affronter des langage plus véloces comme C# ou C++, avec une prévision à 15 coups d’avance ce qui était largement suffisant. Je reviendrai d’ailleurs dans un prochain article sur l’utilisation de numpy. 

Si vous avez des questions sur les challenges Codingame ou si vous voulez simplement échanger autour de ce sujet, n’hésitez pas à nous contacter, nous nous ferons un plaisir de vous répondre ! 

Un sujet vous intéresse ? Une question ? Contactez-nous !

FacebookLinkedInTwitter
Logo Agaetis
Nos adresses
Clermont-Ferrand
9, allée Evariste Galois
63170 Aubière
Tél. 04 73 35 47 51
Paris
21, rue de la banque
75002 Paris
Tél. 01 44 63 53 13
Lyon
52, Quai Rambaud
69002 Lyon
© 2021 Agaetis - Tous droits réservés

Ce site utilise des cookies à des fins de mesures d'audience, ainsi que pour améliorer votre expérience de navigation