Advent of Code 2024
(adventofcode.com)- Advent of Code, l’événement de puzzles de programmation de décembre, est conçu pour abaisser les barrières liées au niveau et au choix du langage, afin de permettre une participation à des fins variées comme la pratique, l’enseignement ou la compétition
- Il n’est pas nécessaire d’avoir une formation en informatique ni du matériel puissant, et chaque problème admet une solution qui s’exécute en au plus 15 secondes sur du matériel vieux de 10 ans
- En cas de blocage, il faut réduire le problème étape par étape : vérifier les exemples, créer ses propres cas de test, valider les entrées, puis demander de l’aide à des amis ou au subreddit
- La FAQ 2024 récapitule les règles de fonctionnement, comme la modification de la durée de l’événement, la suppression du global leaderboard, les règles des private leaderboards, l’usage de l’IA, ainsi que les restrictions sur la copie et la redistribution
- La compétition de vitesse est facultative, et les participants peuvent surtout se concentrer sur la résolution des puzzles et l’apprentissage de la manière qui leur est la plus utile
Nature d’Advent of Code et conditions de participation
- Advent of Code est un événement au format calendrier de l’Avent composé de petits puzzles de programmation
- Les puzzles visent différents niveaux de compétence et peuvent être résolus dans le langage de programmation de son choix
- Il peut servir à préparer des entretiens, à la formation en entreprise, aux devoirs universitaires, aux exercices pratiques, à la compétition de vitesse ou à des défis entre participants
- Une formation en informatique n’est pas indispensable : un peu de connaissances en programmation et de capacité à résoudre des problèmes suffisent pour participer
- Un ordinateur puissant n’est pas nécessaire non plus, et chaque problème admet une solution qui s’exécute en au plus 15 secondes sur du matériel vieux de 10 ans
Démarche à suivre quand on est bloqué
- En cas de blocage, il faut d’abord valider son programme avec les exemples inclus dans le puzzle
- Si les résultats des exemples ne correspondent pas, il faut relire l’énoncé et vérifier les points mal compris ou les comportements du programme différents de ce qui était attendu
- Si les exemples sont corrects mais que la réponse finale est fausse, il faut créer soi-même des cas de test dont on peut vérifier la réponse à la main, puis les appliquer au programme
- Il faut aussi vérifier que l’intégralité de l’entrée du puzzle a bien été utilisée
- Si l’on reste bloqué, on peut demander de l’aide à un ami ou y revenir plus tard, et il est aussi possible d’obtenir des indices sur le subreddit
Utilisation du site et authentification
- Si JavaScript est activé, les blocs de code peuvent être entièrement sélectionnés par triple-clic
- L’authentification utilise OAuth pour vérifier l’identité via un service externe
- Lors de la connexion, les identifiants ne sont fournis qu’au service externe concerné, pas à Advent of Code
- Le service externe informe les serveurs d’Advent of Code que l’utilisateur est bien la bonne personne
- En général, aucune information supplémentaire n’est révélée en dehors de celles déjà publiques
- Advent of Code mémorise l’identifiant unique du service d’authentification, le nom, l’URL et l’image
- Si le texte du site est difficile à lire, une feuille de style alternative à fort contraste peut être utilisée
- Firefox la prend en charge nativement via View → Page Style → High Contrast
Difficulté, heure de publication et durée de l’événement
- La difficulté et les thèmes des puzzles varient selon les éditions
- En général, les puzzles deviennent plus difficiles avec le temps, mais la difficulté perçue peut varier fortement selon la combinaison de compétences de chacun
- Les puzzles sont publiés à minuit EST/UTC-5
- C’est l’horaire qui permet à l’organisateur de vérifier sereinement que tout fonctionne correctement
- Il n’y a aucun problème à ne pas participer à minuit, et les compétitions locales peuvent utiliser les private leaderboards
- Le nombre de jours de l’événement a changé
- Gérer Advent of Code demande chaque année beaucoup de temps libre, dont la majeure partie est consacrée à la création des puzzles
- Après avoir tenu ce rythme pendant 10 ans, un changement est devenu nécessaire
- Les puzzles commencent le 1er décembre pour correspondre à leur numéro de jour, sont publiés quotidiennement et se terminent à la mi-décembre
Leaderboards et compétition de vitesse
- Le global leaderboard a été supprimé
- C’était l’une des plus grandes sources de stress pour l’organisateur, l’infrastructure et de nombreux utilisateurs
- Certains participants prenaient la compétition beaucoup trop au sérieux, allant jusqu’à des comportements comme des attaques DDoS
- Beaucoup d’utilisateurs en concluaient à tort qu’ils étaient de moins bons programmeurs simplement parce que leur temps était plus lent que celui des autres
- Ce qui avait commencé comme une fonctionnalité amusante en 2015 est devenu, en 10 ans, un problème de plus en plus important
- La vue en lecture seule d’un private leaderboard peut être partagée
- Il ne faut pas utiliser cette fonctionnalité ni ces données pour recréer un nouveau global leaderboard
- Les temps de résolution rapides sont facultatifs
- Résoudre rapidement demande, en plus de la résolution du puzzle elle-même, de nombreuses compétences supplémentaires et beaucoup d’entraînement
- Le code de speed-solve a souvent un aspect très différent d’un code qui passerait une revue de code
- Il est tout à fait acceptable de choisir une approche adaptée à ses propres objectifs et d’ignorer complètement la compétition de vitesse
Usage de l’IA et règles des private leaderboards
- Si l’on appartient à un private leaderboard, il faut vérifier les règles attendues par l’organisateur
- Si ces règles ne conviennent pas, on peut chercher un autre private leaderboard ou en créer un soi-même
- Les règles d’un private leaderboard peuvent inclure le temps d’exécution maximal, les langages autorisés, le moment où l’on a le droit d’ouvrir un puzzle, les outils utilisables, voire l’obligation de porter un chapeau ridicule pendant qu’on travaille
- L’usage de l’IA n’est pas recommandé pour résoudre les puzzles d’Advent of Code
- Une analogie est utilisée : envoyer un ami à la salle de sport ne vous rend pas plus fort
- Les puzzles sont conçus pour être intéressants à résoudre par des humains, sans tenir compte du fait qu’une IA puisse ou non les résoudre
- Si l’objectif est de s’exercer aux prompts IA, d’autres exercices conçus pour cela peuvent être plus adaptés
Idées de puzzles, bugs et politique de copie
- Il ne faut pas envoyer d’idées de puzzles
- Aucune idée n’est acceptée en raison de questions juridiques comme le copyright et l’attribution
- Pour éviter même le risque d’utiliser accidentellement une partie d’une proposition, les e-mails qui ressemblent à des idées de puzzles ne sont pas lus
- Si vous pensez avoir trouvé un bug dans un puzzle, il faut d’abord vérifier sur le subreddit
- Une heure après la publication d’un puzzle, de nombreuses personnes l’ont déjà résolu, donc au-delà de ce délai la probabilité d’un bug est très faible
- Advent of Code peut être utilisé gratuitement, mais sa copie n’est pas libre
- Il ne faut pas inclure dans un dépôt de code des passages des puzzles ni ses propres entrées Advent of Code
- Lors de la création d’un site web, il ne faut pas lui donner l’apparence d’Advent of Code ni un nom similaire
Mentions légales et périmètre autorisé
- Advent of Code est une marque déposée aux États-Unis
- Les éléments de design, la formulation, le style et le concept d’Advent of Code sont la propriété exclusive d’Advent of Code et ne peuvent pas être copiés ni utilisés sans accord écrit explicite
- La mention de copyright est 2015-2025 Advent of Code, tous droits réservés
- Il est possible de créer des liens vers les puzzles Advent of Code ou d’y faire référence dans des discussions, des cours, du code source, des documents imprimés, etc., y compris dans un contexte commercial
- Advent of Code ne revendique ni propriété ni droits d’auteur sur les implémentations de solutions des utilisateurs
1 commentaires
Avis sur Hacker News
J’aime AoC, et ces 2 ou 3 dernières années je l’ai fait en Rust ; sur Discord, on s’amusait à produire tous ensemble la solution la plus rapide
Dans le processus, j’ai appris toutes sortes d’astuces d’optimisation des performances, des algorithmes avancés et SIMD
Cette fois, je suis en train de le faire en Rust et en Go pour voir si je vais finir par aimer, ou du moins supporter, Go que j’utilise au travail, ou bien confirmer l’hypothèse que je ne l’aime pas trop et ne l’utiliser que quand c’est vraiment nécessaire
C’est pragmatique, il y a peu de configuration d’environnement ou de tâches annexes, la plupart des fonctions nécessaires comme la lecture de fichiers et le parsing sont intégrées, les performances sont bonnes et le langage reste assez proche du matériel, avec peu de pièges de performance cachés
Je n’ai jamais utilisé Rust, donc la comparaison est difficile, mais vu très superficiellement, il me paraît moins pragmatique
AoC n’a pas vraiment besoin de critères de production comme la sûreté mémoire ; pour les problèmes de fin de calendrier, le pragmatisme et les performances semblent plus importants que la sûreté
Chaque année, j’essaie d’optimiser la vitesse en Zig : https://github.com/ManDeJan/advent-of-code
À l’inverse, mon dilemme est plutôt d’essayer d’aimer Rust
J’ai voulu essayer en Rust, mais je ne vois pas bien s’il faut séparer les modules par date, mettre chaque jour dans un fichier de bibliothèque et le relier à un point d’entrée principal, etc.
Si vous avez un dépôt public, ce serait bien de le partager
Le défi de cette année est de l’écrire en C sans bibliothèque standard ni allocateur
Il doit pouvoir tourner sur un STM32 avec 32 Ko de SRAM
Il y a deux ans, j’avais essayé en assembleur, mais après avoir passé des heures à créer une bibliothèque standard pour l’assembleur, j’ai abandonné et je suis passé à Rust
Je ne suis pas allé très loin ; sans protection mémoire, ça devient vraiment difficile
Cette année, mon Amiga dispose d’une mise à niveau 060 avec MMU, donc je pourrais essayer de comprendre comment l’exploiter et m’y remettre
C inclus, et l’absence de table de hachage a été vraiment douloureuse
https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
Ce serait sympa de poster un lien vers le dépôt pour qu’on puisse suivre l’avancement
L’an dernier, j’ai résolu tous les problèmes en C sans bibliothèque externe [1], et c’était très amusant
Ça m’a poussé à réimplémenter des éléments bas niveau que j’avais oubliés, comme le tas, et aussi à écrire mes propres routines numériques ; c’était plus facile que prévu
[1] https://github.com/sebastianotronto/aoc/tree/master/2023
grep autorisé, awk interdit, par exemple : c’est tout aussi limité, mais sans bugs fatals de corruption mémoire
D’habitude, je fais AoC en Common Lisp, mais cette année j’essaie Swift
Pour un langage grand public à typage statique, il s’en sort plutôt bien pour ce genre de petites manipulations
https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
Cette année est un peu étrange : j’étais en train de préparer un événement dans mon nouveau travail
Parce que je pensais que ce serait utile aux développeurs pour apprendre à résoudre de vrais problèmes plutôt qu’à assembler des frameworks
Mais mon nouveau patron s’est révélé être quelqu’un avec qui il était impossible de travailler, donc j’ai dû partir
Au final, comme toujours, il ne restera probablement que moi et Emacs
Comparer les différentes solutions est assez intéressant
J’avais essayé de faire AoC en Swift auparavant, mais cette partie m’avait pas mal refroidi
Les petites solutions fonctionnelles en une ligne étaient sympa, mais au bout d’une semaine environ, la charge du parsing risque de devenir trop importante
J’avais envie d’essayer Swift cette année, mais lancer Xcode juste pour ça me paraît un peu excessif
Ça y est, c’est de retour : la saison où l’on écrit pendant 25 jours des parseurs d’entrée de plus en plus complexes
Le vrai problème est de parser l’entrée dans une forme facile à manipuler ; une fois le parsing terminé, ça devient simple
Ce qui devient plus complexe, ce sont les problèmes eux-mêmes ; même les problèmes difficiles autour du jour 22 ou 23 ont généralement une entrée du type lignes d’entiers séparés par des espaces ou grille de points, comme les problèmes faciles des jours 1 à 3
Cette année, l’objectif est de réunir toutes les étoiles et d’atteindre un total de 500 étoiles
En gros, finir toutes les années et tous les problèmes
La semaine dernière, il y avait environ 1 024 personnes qui avaient 450 étoiles au total
Je n’ai commencé que vers le day 6 de 2022, mais j’ai accroché, et début 2023 j’avais du temps, donc j’ai enchaîné les années précédentes
Ce n’est pas extrêmement difficile si l’on prépare quelques algorithmes, et certains thèmes reviennent d’une année à l’autre
C’est amusant de se remettre à de vrais algorithmes qu’on ne manipule pas souvent au quotidien
Merci aux bénévoles et à Eric ; à partir de maintenant, je compte faire un don chaque année. C’est vraiment un excellent événement
C’est l’un des moments forts de cette période, et j’aime beaucoup ça
Cette fois, j’ai dû le faire dans un avion qui traversait le Pacifique vers l’est
C’est devenu une tradition amusante, pour moi comme pour mes amis, mes collègues et les gens de HN
Je trouve encore une fois impressionnant ce que wastl et les elfes assistants ont créé
Les personnes qui en tirent de la valeur devraient le soutenir si elles le peuvent
C’est certes un projet passion, mais il a aussi de vrais coûts
Cela dit, adventofcode est vraiment excellent, et il vaut mieux le soutenir si possible
Mais vu le niveau de soutien qu’il reçoit actuellement, le créateur doit probablement s’en sortir plutôt bien
Cette année, j’aimerais essayer avec F# et Gleam, mais comme chaque année, je n’aurai probablement pas le temps ni l’énergie d’aller au-delà de 10 à 12 jours
Les personnes qui utilisent Python devraient aussi essayer F#
Cela peut donner une sensation assez proche du scripting, et il dispose aussi d’un excellent REPL
La première année, ça m’a motivé à créer une bibliothèque standard pour que ce ne soit pas trop fastidieux
Maintenant, je me dis que j’aurais aimé avoir terminé de meilleurs outils
Je débogue avec wsjq[1], un débogueur CLI façon gdb écrit en jq, mais c’est lent
[0]: https://github.com/thaliaarchi/ws-challenges
[1]: https://github.com/thaliaarchi/wsjq
C’était amusant, même pour quelqu’un qui n’avait pas d’expérience en programmation fonctionnelle
Cette année, je n’ai pas le temps de participer, mais si je le faisais, je choisirais probablement encore F#
Je n’en suis encore qu’au début de mon parcours fonctionnel, mais jusqu’ici, je pense que l’AoC m’a aidé
L’an dernier, je suis resté bloqué toute une semaine sur le Day 12, et tout mon temps éveillé était accaparé par la recherche d’une solution
Cette année, je vais être un peu plus indulgent avec moi-même : je ne participerai pas, et je vais vraiment profiter des vacances d’hiver
Maintenant, je ne regarde même plus. Le plaisir se transforme assez vite en stress
Il est important de poser des limites et de profiter des moments de repos
Pour moi, Advent of Code ressemble à une pente glissante
La difficulté augmente : au début c’est facile, puis difficile mais gratifiant, et soudain on y consacre beaucoup trop de temps
À ce moment-là, on s’est déjà investi émotionnellement, et c’est le danger
https://eli.li/december-adventure
J’ai même dû écrire un moteur de graphe à forces pour trouver les trois arêtes les plus longues à couper
Après l’avoir résolu, j’ai regardé les solutions des autres : certains utilisaient le solveur propositionnel de Meta et s’en sortaient en une dizaine de lignes
Pour moi, ça ressemblait à une énorme triche
J’aime AoC
Pas besoin de se demander si des bots IA le résolvent, ou si d’autres se lèvent plus tôt : il suffit de le faire pour son propre plaisir
Que ce soit pour le défi lui-même ou pour tester un nouveau langage, peu importe
Moi, j’aime le résoudre autant que possible en style fonctionnel Kotlin, pour faire quelque chose de différent de mon travail
J’ai aussi publié ma solution du jour. Ce n’est pas du Kotlin pur, parce que j’utilise des utilitaires, mais rassembler de belles fonctions pour en faire une sorte de bibliothèque fait aussi partie du plaisir
https://github.com/Matsemann/algorithm-problems/blob/main/ad...
Ces dernières années, j’utilisais Python NumPy, et cette année je passe à Kotlin ; sur le problème du premier jour, c’est la fonction transpose qui m’a le plus manqué
Mon code est ici : https://github.com/charelF/AdventOfCode/blob/main/kt/src/y20...