Publié le 22/05/2024 Par Gaëtan Eleouet

L’édition 2024 de Code On Time lancé par Meritis s’est tenu du 22 avril au 1er mai dernier. Cette année, le concours a enregistré la participation de 384 développeurs de tous niveaux, le plaçant ainsi à la première place des concours de code français en ligne !

Code on time 2024 éléments de résolution

Malgré une difficulté croissante, les quatres exercices proposés ont été résolus par une centaine de participants. Avec une seule règle à suivre : « Pas de règles » ! À partir du jeu de données et de la consigne, les participants étaient ainsi libres de choisir leur méthode, leurs outils, etc. Résultat : certain.e.s ont utilisé des outils de data, d’autres du code et même Excel !

Retour sur les exercices et les méthodes utilisées pour les résoudre.

👉🏻  Envie d’en savoir plus sur les solutions créatives et innovantes des participants au concours de code de l’année précédente ? Découvrez comment les développeurs ont relevé les défis du Code On Time 2023.

1

exercice de code : la course

Les temps de chaque athlète et leur pays d’appartenance étaient fournis aux participants. Le but du jeu consistait à trouver quel pays avait fait le meilleur temps en additionnant les temps des athlètes de chaque pays.

Une solution possible était d’utiliser un dictionnaire pour comptabiliser les temps de chaque pays.

Bien évidemment, la bonne réponse était la France, avec dans l’équipe française Marjorie Veyssière, athlète sponsorisée par Meritis !

2

exercice : l’entraînement

Ici, les développeurs se voyaient fournir une suite de temps. Il leur était ensuite demandé de construire, en conservant l’ordre fourni, la plus grande suite de valeurs décroissante sans doublon.

Cet exercice acceptait des réponses non optimales et a posé des difficultés à de nombreux participants !

La solution optimale se basait sur de la programmation dynamique, en tant que déclinaison de l’explication sur l’exercice du SWERC.

3

exercice : la cérémonie de clôture

Pour la cérémonie de clôture, les données représentaient les moments d’entrée et de sortie dans le vestiaire. La consigne était de trouver le nombre maximal de personnes présentes en même temps dans le vestiaire.

La principale difficulté ici était de trouver une solution en un temps raisonnable, le nombre de données étant important.

Une façon de faire pouvait alors être de créer un tableau de la taille du temps maximal, et de mettre pour chaque donnée +1 au temps d’entrée et -1 au temps de sortie.

Ensuite, il fallait parcourir et additionner les valeurs en gardant le maximum.

Pseudo code :

Vestiaire int[temps maximum]
Pour chaque donnée
             Vestiaire[donnée.entrée] ++ ;
             Vestiaire[donnée.sortie] — ;
Entier Max = 0
Entier Courant = 0
Pour index dans Vestiaire
             Courant += Vestiaire[index]
             Si Courant > Max
                           Alors Max = Courant
Résultat = Max

4

exercice : les relais !

Cet exercice était l’exercice d’optimisation du concours. La solution parfaite n’a été trouvé que par un seul participant !

C’est une variation du problème de « bin packing », à savoir ranger des objets dans des boîtes. Il faut alors constituer des groupes en minimisant une mesure entre les groupes.

Ici, 5 jeux de données de taille différente étaient proposés, et curieusement, les jeux de données les plus petits étaient les plus difficiles.

livre blanc software craftsmanship

Software Craftsmanship : Au-delà du code, découvrez les clés d’un développement applicatif réussi

💡 Le constat est sans appel : La qualité du code n’est pas l’unique secret du succès !
Le développement applicatif est exigeant et évolue constamment.
Des décisions initiales avisées déterminent la réussite d’une application.

Retour d’expérience

Pierre, malgré ses vacances, a tenu la première place du classement les premiers jours et nous partage son approche :

« J’ai choisi l’approche très classique du recuit simulé (simulated annealing en anglais), une méthode d’optimisation basée sur un phénomène métallurgique. Le recuit a l’avantage d’être beaucoup plus rapide à implémenter que d’autres algorithmes randomisés (comme les algorithmes génétiques) et de généralement permettre une convergence rapide vers une bonne solution.

Son principe est de faire varier un état (c’est-à-dire une potentielle solution) via des mutations (modifications élémentaires) qui ont plus ou moins de chances de se produire selon leur qualité (à quel point la mutation améliore / détériore le score de l’état) et selon la température du recuit, qui diminue au fil du processus (plus la température est élevée, plus une mutation a une grande probabilité d’être acceptée même si elle n’améliore pas le score).

Voici comment j’ai transposé les différents concepts au problème :

  • État : partition des coureurs en équipes + ordre des coureurs dans chaque équipe. L’état initial utilise l’ordre des coureurs dans le fichier d’entrée.
  • Score : comme défini dans l’énoncé, la différence de temps entre l’équipe la plus rapide et l’équipe la plus lente. On cherche à minimiser ce score.
  • Mutation : inversion des positions de 2 coureurs sélectionnés aléatoirement.

Remarque : pour qu’une mutation améliore le score de l’état, il est nécessaire qu’elle modifie l’équipe la plus lente ou l’équipe la plus rapide. J’ai donc fait en sorte que toutes mes mutations déplacent au moins un coureur issu d’une équipe au temps extrême, ce qui a permis à mon recuit de converger beaucoup plus vite vers de bons scores.

Un autre facteur important est la performance. Générer, évaluer et appliquer une mutation doit être très rapide pour permettre d’en faire le plus possible et explorer plus efficacement l’espace des solutions.

Le choix du langage a un impact (C++ de mon côté), mais il faut aussi écrire le recuit de façon efficace. En particulier, lorsqu’on a des centaines, voire des milliers, de coureurs, il faut éviter de copier tout l’état pour générer un état muté. Dans mon code, chaque mutation échange directement 2 coureurs dans l’état actuel. Et si la mutation n’est pas conservée, les coureurs sont échangés à nouveau pour revenir à l’état précédent.

Il faut également éviter d’itérer sur tous les coureurs pour calculer le nouveau score. Je garde en mémoire les temps de toutes les équipes dans une structure de données permettant un accès rapide au minimum et au maximum, ce qui me permet de calculer le nouveau score sans réévaluer les équipes qui n’ont pas été modifiées.

Ces optimisations peuvent rendre l’état et le score plus difficiles à maintenir dans le code, mais sont vraiment utiles pour obtenir de meilleurs résultats. Mes meilleures solutions ont été trouvées en exécutant des recuits sur une dizaine de minutes. »

De la même manière, Yoann Coudert-Osmont alias Nanored4498, qui a remporté le concours, nous a détaillé ses algorithmes.
Découvre ici les solutions du vainqueur

Les années se suivent se ressemblent. Cette fois encore, Code On Time a été un vrai succès, enregistrant un nombre record de participants. Nous n’avons qu’une chose à dire : vivement l’an prochain !

mieux comprendre avec meritis

Tu es en veille ou à l’écoute du marché ?

Que tu sois en recherche active ou simplement curieux des nouvelles possibilités, explore les postes qui pourraient te convenir.
Clique ici pour en savoir plus.


Pour aller plus loin

code on time 2022 resolution

Code on Time 2022 : comment relever le défi ?

À l’occasion de Devoxx 2022, Meritis a lancé le concours de code CodeonTime. 346 développeurs ont participé à ce défi palpitant, s’efforçant de résoudre quatre exercices de code de la manière la plus efficace possible.

Cet article revient sur les moments forts de l’événement, partage les retours d’expérience des meilleurs participants et dévoile les conseils avisés de Gaëtan Eleouet, expert Java chez Meritis.

meritis master dev france 2023

Meritis au Master Dev de France 2023

Meritis a pris part au Master Dev France 2023 avec une équipe de cinq experts. Cinq étudiants ont également eu l’opportunité de participer à cet événement. Félicitations aux huit développeurs qui ont atteint la finale !


Pas encore de commentaires

Publier un commentaire

Gaetan Elouet photo

Auteur

Gaëtan Eleouet

Gaëtan est un développeur passionné, il s’intéresse particulièrement à tout ce qui a trait à l’écosystème Java, à l’intelligence artificielle et aux pratiques de développement.
Il a commencé sur des interfaces graphiques en Java, dans l’industrie puis en développement rapide en salle de marché. Il a ensuite consolidé les aspects professionnels du développement dans des grands groupes en finance et est maintenant également enseignant en école d’ingénieur.