1 points par GN⁺ 2024-12-02 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2024-12-02
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

    • Ces dernières années, j’ai essayé de le faire en Go ; après le jour 6, j’ai toujours manqué de temps ou de concentration, mais pour cet usage c’était plutôt bien
      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é
    • Je serais curieux de voir une approche pour résoudre rapidement en Rust ; si vous avez des liens à partager, ça m’intéresse
    • Ce serait bien si vous pouviez partager le Discord
      Chaque année, j’essaie d’optimiser la vitesse en Zig : https://github.com/ManDeJan/advent-of-code
    • Go n’est pas « Golang », ses temps de compilation sont meilleurs que ceux de Rust, et il n’essaie pas de forcer ensemble des modèles de concurrence incompatibles
      À l’inverse, mon dilemme est plutôt d’essayer d’aimer Rust
    • Je me demande comment vous structurez un projet AoC
      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

    • L’an dernier, je l’ai fait en C sur un vrai Amiga 1200, avec le compilateur/runtime DICE de Matt Dillon
      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
    • Cette année encore, je pars sur Common Lisp, mais pour le problème du premier jour j’ai décidé d’essayer tous les langages que je « connais »
      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
    • Cette contrainte a l’air assez difficile, mais bonne chance
      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
    • Tant qu’on peut faire des appels RPC, on peut tout faire avec 32 Ko de RAM :-)
    • Par symétrie, on pourrait aussi envisager de n’utiliser que sh et des outils CLI standard non Turing-complets
      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

    • Si ce n’est pas déjà fait, vous devriez rejoindre le classement Swift : https://forums.swift.org/t/advent-of-code-2024
      Comparer les différentes solutions est assez intéressant
    • Je me demande si le parsing et la manipulation de chaînes en Swift ne sont pas assez pénibles
      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
    • Je me demande si vous écrivez, compilez et exécutez vos solutions entièrement dans Emacs
      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

    • Ce sont les problèmes que je déteste le plus
      Le vrai problème est de parser l’entrée dans une forme facile à manipuler ; une fois le parsing terminé, ça devient simple
    • Au bout de quelques jours, je finis toujours par utiliser des expressions régulières, que j’oublie chaque année et dois réapprendre
    • Les parseurs d’entrée ne deviennent pas plus complexes au fil des jours
      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
    • C’est juste qu’ils ajoutent une histoire amusante autour du parsing de l’entrée
    • À mon avis, scanf et une machine à états sont bien plus efficaces que les parseurs de style split/explode
  • 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

    • Avec autant de sponsors et d’utilisateurs d’AoC++, j’ai du mal à voir cela comme un petit projet passion qui aurait du mal à payer un abonnement mensuel à un VPS
      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

    • Je poursuis la tradition de résoudre AoC en Whitespace [0]
      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
    • Je le fais en bash, pour voir jusqu’où je peux aller
    • J’ai fait les deux derniers AoC en F#, même si, en réalité, je ne suis allé que jusqu’aux premiers jours
      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#
    • Moi aussi, j’ai commencé à apprendre F# et je l’utilise pour l’AoC de cette année
      Je n’en suis encore qu’au début de mon parcours fonctionnel, mais jusqu’ici, je pense que l’AoC m’a aidé
    • Je me demande ce que vaut le support de Linux :)
  • 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

    • Cela m’a bouffé la vie plusieurs années d’affilée, et deux fois j’ai fini de justesse le soir de Noël
      Maintenant, je ne regarde même plus. Le plaisir se transforme assez vite en stress
    • Ça semble sage
      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
    • Un ami m’a récemment partagé ceci, et je pense que ça pourrait te plaire
      https://eli.li/december-adventure
    • Je suis resté bloqué quatre mois sur le puzzle de coupe de graphe
      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...