Contenu

Advent of Code 2022

Le mois de décembre approche et avec lui une nouvelle édition de l’advent of code.

C’est quoi ?

Cet évènement annuel est un calendrier de l’avent proposant des challenges d’algorithmie tous les jours jusqu’au 25 décembre.

La première édition a eu lieu en 2015 et la 7ème a eu lieu en décembre dernier.

Les exercices sont créés par le créateur du site @ericwastl et publiés le 1er décembre de chaque année à 00h00 UTC-5.

Il s’agit chaque jour de résoudre un puzzle avec une donnée en entrée et de calculer la réponse avant de la soumettre sur le site.

Il y a toujours un thème autour des puzzles. Par exemple l’année dernière nous suivions les aventures d’un sous marin dans les profondeurs de l’océan.

Et concrètement ?

Pour chaque puzzle vous aurez: une énoncé du problème, un exemple d’entrée et de sortie et un jeu de données spécifique à votre utilisateur (pour éviter la triche 😉).

Pour le 1er décembre 2021, l’énoncé nous demandait de calculer le nombre de fois que la mesure de profondeur du submersible augmentait.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# la donnée en entrée
199
200
208
210
200
207
240
269
260
263
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# si on le faisait à la main ✋
199 (N/A - no previous measurement)
200 (increased)
208 (increased)
210 (increased)
200 (decreased)
207 (increased)
240 (increased)
269 (increased)
260 (decreased)
263 (increased)

Donc notre algo devrait nous retourner 7

Une implémentation naïve en NodeJS pourrait être celle-ci.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const data = require("fs")
        .readFileSync("./input.txt", {encoding: "utf-8"})
        .split("\n")
        .map(x => parseInt(x));

let previousValue;
let count = 0;
data.forEach((currentValue, index) => {
    if (index === 0) {
        previousValue = currentValue;
    } else {
        if (previousValue < currentValue) {
            count += 1;
        }
        previousValue = currentValue;
    }
})
console.log(count) // 7

Il suffit alors de soumettre la valeur calculée avec le jeu de données fourni pour obtenir l’étoile 🌟 du premier exercice. Pour la seconde, il faut souvent faire évoluer légèrement le premier algorithme. Ce qui ajoute en profondeur et en complexité.

Chez Max

Nous sommes plusieurs chez Max à avoir participé à l’édition 2021 dans nos langages favoris: Ruby, Python, Javascript, Java, Kotlin et Rust.

Ça a été un mois de décembre riche en rigolade et en mal de crâne dû à des poulpes clignotants 😉

Nous avons créé un dépôt git dans notre gitlab ou nous avons posté nos solutions et avons pu échanger sur nos différentes implémentations. C’est marrant de découvrir par exemple tout le sucre que fourni Ruby pour résoudre certains puzzles en seulement quelque lignes.

Le site expose une API pour récupérer les scores de votre LeaderBoard. On a donc développé un bot slack qui scrap notre leaderboard toutes les 15 min et qui poste un message dans notre channel slack quand quelqu’un a résolu un puzzle.

Syndrome de l'imposteur

Avec des phrases générées aléatoirement, j’ai essayé de donner une personnalité au bot mais sans réseau de neurones :D Le projet atterrira peut-être sur Github dans le futur si ça intéresse des gens 😄

Se lancer

Syndrome de l'imposteur

Il ne faut pas avoir peur de se lancer. La difficulté va en progressant au fil des jours et vous pouvez démarrer quand vous voulez.

On ne soumet que la donnée calculée donc la “qualité” du code n’a pas d’importance, seule la réponse et le temps de soumission de la réponse est comptabilisé. Donc tous le coups sont permis pour soumettre le résultat le plus rapidement possible.

Keep It Simple & Stupid

On peut après avoir trouvé le résultat, essayer de trouver une implémentation plus “propre” et aussi aller voir du côté du thread reddit voir les implémentations de la communauté pour son langage.

De mon côté je vais essayer humblement de faire plus que les 21 étoiles de l’an dernier 😅 et je vais tenter de faire les premiers jours en Python. Je me réserve le droit de switcher en JS quand ma vélocité baissera trop par rapport au temps que je veux bien allouer aux différents puzzle 😄

Disclaimer

Addictive

Attention, plus on avance et plus la difficulté augmente. Donc ne pas hésiter à timeboxer le temps qu’on souhaite allouer. Sinon on peut ne pas voir passer le temps quand on veut rien lacher sur un puzzle 😅

Liens