Annonce des lauréats du 29e IOCCC 2025
(ioccc.org)- L’International Obfuscated C Code Contest (concours international de code C obfusqué) est une compétition de programmation qui met en lice les codes C obfusqués les plus créatifs, artistiques et difficiles à lire
- Organisé pour la deuxième fois consécutive après l’interruption de 2020 à 2024, le concours a reçu un nombre de participations comparable à celui de l’an dernier, tout en maintenant un niveau de taille et de qualité des soumissions parmi les plus élevés de son histoire
- Yusuke Endoh, Nick Craig-Wood et Don Yang ont chacun remporté 3 prix, réalisant ainsi un hat trick, et un nouveau lauréat venu de Taiwan a fait son apparition
- Parmi les œuvres primées figurent un ordinateur Subleq, un émulateur GameBoy, un quine patch/diff et d’autres créations variées, avec l’ajout d’un Fun challenge pour chaque lauréat
- L’annonce des prix a eu lieu lors d’un live sur la chaîne YouTube Our Favorite Universe, et le prochain IOCCC30 est prévu pour fin 2026
Point de départ
- Les liens vers les entrées récompensées de l’IOCCC 2025 sont disponibles dans la liste des lauréats en bas de page
- Le
index.htmlde chaque entrée primée fournit la plupart des informations nécessaires pour compiler et exécuter le programme récompensé - Vous pouvez lire le code source lauréat pour comprendre son fonctionnement, puis consulter les explications des auteurs pour plus de détails
- Tous les lauréats de cette année peuvent être téléchargés sous forme de tarball compressé
Remarques générales sur ce concours
- Le volume et la qualité des soumissions d’IOCCC29 ont frôlé des sommets historiques
- IOCCC28, après quatre ans d’interruption, a pu bénéficier du temps supplémentaire dont disposaient les participants pour peaufiner leurs propositions, ce qui expliquerait le nombre record de soumissions et leur qualité inhabituellement élevée
- IOCCC29 était la deuxième édition consécutive après l’interruption de 2020 à 2024, mais le nombre de soumissions est resté comparable à celui de l’an dernier, avec un niveau global toujours élevé
- Depuis la clôture d’IOCCC28, les organisateurs ont soigneusement documenté la fermeture des soumissions, le processus de jury, la sélection des lauréats, la mise à jour du site web et la production du live sur Our Favorite Universe
- Cette documentation a demandé du temps et des efforts supplémentaires, mais elle a permis d’améliorer l’ensemble du fonctionnement de l’IOCCC
- Quelques jours après l’annonce des lauréats d’IOCCC29 sur la chaîne YouTube Our Favorite Universe, l’enregistrement principal sera découpé en segments individuels
- En haut du
index.htmlde chaque entrée primée, une nouvelle section Award presentation sera ajoutée avec un lien vers le segment YouTube correspondant -
Informations sur les défis amusants
- Les lauréats de cette année incluent un défi amusant sous la section « Judges’ remarks »
- Il est recommandé d’essayer ces défis après avoir compris le fonctionnement de l’entrée concernée
- Certains défis sont plus faciles que d’autres et, dans certains cas, demandent de produire une version alternative de
prog.cou de fichiers associés - D’autres demandent de rédiger une explication sur un point précis
- Si la section « A fun challenge » d’un lauréat donné est toujours marquée still open, vous pouvez contribuer en soumettant une GitHub pull request
- Même si le défi est clos, vous pouvez toujours soumettre une GitHub pull request si vous pensez disposer d’une meilleure solution
- Si les IOCCC Judges estiment qu’il s’agit effectivement d’une meilleure solution, elle pourra être examinée
- Si vous avez une amélioration plus intéressante pour un défi amusant associé à un lauréat, vous pouvez soumettre une GitHub pull request pour examen par les IOCCC Judges
-
Règles et directives de ce concours
- La version finale des règles appliquées à cette édition est 2025 rules, version 29.15 2025-12-02
- La version finale des directives appliquées à cette édition est 2025 guidelines, version 29.08 2025-12-02
- Les règles et directives d’IOCCC29 ont été largement remaniées par rapport au concours précédent
- Plusieurs bénévoles ont aidé les IOCCC Judges avec des corrections utiles, des reformulations, des consolidations et une amélioration générale de la structure
-
En route vers le prochain concours
- IOCCC30 devrait s’ouvrir vers la fin de 2026
- IOCCC30 se déroulera sur une période similaire et devrait se terminer vers la fin du premier trimestre 2027
- En préparant l’ouverture d’IOCCC30, les organisateurs comptent documenter les procédures internes comme ils l’ont fait à la clôture d’IOCCC29
- Environ 2 à 3 semaines après la publication des lauréats d’IOCCC29, et après avoir traité certaines premières pull requests sur l’arborescence du répertoire 2025, les IOCCC Judges prévoient des IOCCC vacation
- Après la publication des lauréats d’IOCCC28, des IOCCC vacation étaient également prévues, mais les corrections de bugs et améliorations du repo mkiocccentry ont demandé tant de temps que, lorsque le dépôt a été stabilisé, l’ouverture d’IOCCC29 était déjà arrivée
- Cette fois, le travail sur les PRs du repo mkiocccentry est prévu après la fin des IOCCC vacation post-IOCCC29
Remarques sur certains lauréats
- Lors de la rédaction de textes potentiels sur les soumissions arrivées au dernier tour du dernier ensemble de tours de jugement, certaines ont été écartées à la toute fin du tour final
- Cela a encore renforcé l’admiration et l’appréciation portées à plusieurs des entrées restantes
- Les auteurs primés viennent à la fois de régions déjà représentées parmi les lauréats précédents, et IOCCC29 a aussi accueilli jingp49, nouveau lauréat originaire de Taiwan
- Trois auteurs ont chacun remporté trois distinctions, constituant ainsi des Hat-tricks de Hat trick)
- Parmi les lauréats remarquables d’IOCCC29, on trouve notamment :
- 2025/cable: ordinateur Subleq
- 2025/cesmoak: Fortran sur cartes perforées de trou noir
- 2025/endoh3: quine patch/diff
- 2025/jhshrvdp: quasi jeu rogue-like
- 2025/jingp49: suite Dr. WHO
- 2025/ncw1: émulateur GameBoy
- 2025/tompng: générateur de sons marins
- 2025/uellenberg: quine pong
- 2025/yang2: encodage Zoltraak
- Cette liste ne représente qu’une partie des nombreux lauréats exceptionnels d’IOCCC29
-
Remarques sur certaines soumissions non récompensées
- De nombreuses excellentes soumissions sont passées tout près de la sélection finale sans être primées
- Les efforts fournis par chaque auteur pour son entrée sont grandement appréciés, mais les prix ne peuvent pas être attribués sur le seul critère de l’effort
- Le code soumis à IOCCC29 sans être récompensé peut être retravaillé puis soumis à nouveau pour IOCCC30
- Au moins une des œuvres primées d’IOCCC29 est une version améliorée d’un code non récompensé lors d’un concours précédent
-
Encouragements aux participants non récompensés cette année
- Les soumissions de cette année à l’IOCCC ont demandé beaucoup d’efforts, mais il n’est pas possible de donner un prix à tout le monde
- Récompenser toutes les soumissions enlèverait leur valeur à celles jugées les meilleures et dignes d’un prix
- Une soumission arrivée au tour final peut être suffisamment bonne pour gagner, tout en étant devancée par une proposition très similaire mais légèrement meilleure
- Si vous pensez être dans ce cas, il est recommandé de soumettre une version améliorée au prochain IOCCC
- Certaines entrées ont atteint le niveau d’un lauréat après plusieurs cycles de révision et de soumission
- Vous pouvez aussi tenter un type de soumission totalement différent lors du prochain IOCCC
- Si vous ne prévoyez pas de retravailler et resoumettre une entrée non récompensée au prochain IOCCC, elle peut être rendue publique
Compilation et exécution des lauréats
- Certains compilateurs C peuvent ne pas produire des résultats suffisamment bons
- Si votre compilateur ne fonctionne pas correctement, vous pouvez essayer de compiler avec une version récente de
clangougcc - En cas de problème lors de la compilation ou de l’exécution d’un lauréat, vous pouvez consulter la FAQ suivante :
- Pour plus d’informations sur l’envoi de corrections, vous pouvez consulter la FAQ suivante :
- How to submit a fix: comment soumettre un correctif pour une entrée
- Update author information: comment corriger ou mettre à jour les informations d’un auteur IOCCC
Lauréats du 29e IOCCC 2025
- L’ensemble complet des lauréats est disponible via Télécharger les lauréats 2025
- 2025/ayu: prix IMO
- 2025/cable: prix du meilleur émulateur imaginaire
- 2025/cesmoak: prix rétro cosmique
- 2025/diels-grabsch: prix du meilleur one-liner
- 2025/dogon: prix du constamment constant
- 2025/endoh1: prix du plus susceptible d’éblouir
- 2025/endoh2: prix du plus susceptible de provoquer un choc
- 2025/endoh3: prix de la meilleure résilience
- 2025/ferguson: prix de l’opposé
- 2025/howe: prix du plus susceptible d’envahir
- 2025/jhshrvdp: prix du plus susceptible de se téléporter
- 2025/jingp49: prix Who won
- 2025/kurdyukov: prix du plus susceptible de compter
- 2025/mattpep: prix de l’option la plus obfusquée
- 2025/ncw1: prix du meilleur émulateur réel
- 2025/ncw2: prix du meilleur émulateur fractionnaire
- 2025/ncw3: prix du meilleur usage d’Unicode
- 2025/tompng: prix le plus relaxant
- 2025/uellenberg: prix ping-pong
- 2025/yang1: prix composé
- 2025/yang2: prix du mot le plus magique
- 2025/yang3: prix INABIAF
1 commentaires
Commentaires sur Hacker News
Le code de l’émulateur GameBoy va jusqu’à ressembler à une GameBoy. C’est assez dingue pour mériter un lent applaudissement, et c’est personnellement ma participation préférée de cette édition
https://github.com/ioccc-src/winner/blob/master/2025/ncw1/pr...
L’auteur, Nick Craig-Wood, est la personne qui a créé rclone
https://github.com/ncw/ioccc-gameboy
Il y a aussi là-bas une version à peu près non obfusquée. C’est sur celle-là que j’ai réellement travaillé, puis j’ai utilisé un programme pour écraser tous les noms de variables et compresser le tout afin de lui donner la forme d’une GameBoy
La limite de taille de la participation a été la partie la plus difficile. Les entrées de l’IOCCC sont limitées à 2503 caractères hors espaces, et la taille totale du code est de 4 KB, ce qui est vraiment minuscule pour y faire tenir un processeur Z80 et un émulateur du matériel GameBoy
Au départ, j’ai écrit un émulateur GameBoy complet en C, en partant d’environ 6000 caractères hors espaces. J’ai ensuite passé environ 100 heures à essayer de rentrer dans la limite des 2503 caractères, et pendant un moment je n’étais pas certain que ça tiendrait
J’ai fixé comme objectif de faire tourner Tetris. Comme Tetris est un jeu relativement simple, j’ai supprimé des fonctionnalités non nécessaires, comme le drapeau half carry de l’émulateur Z80 ou le système de fenêtrage de l’émulation GameBoy. J’ai aussi atrocement maltraité le code C, et j’ai même refait des choses en
implicit intque je n’oublierai jamais. Comme le vérificateur de règles de l’IOCCC est lui-même implémenté en programme C, j’ai aussi passé du temps à le rétroconcevoir pour y trouver des failles. Le fait d’avoir découvert que certains opérateurs ne comptaient que pour un seul token a été particulièrement utileUne fois le programme suffisamment réduit, il fallait encore intégrer des jeux à exécuter. J’en ai créé quatre : un programme de test écrit en assembleur Z80, un calculateur de pi en assembleur, un morpion 3D écrit en C avec gbdk-2020, et un programme d’échecs écrit en C. J’ai aussi découvert qu’un bon nombre de jeux open source fonctionnaient sur cet émulateur, donc j’ai ajouté un téléchargeur quand c’était possible. Étonnamment, il n’y avait pas beaucoup de jeux qui utilisaient l’arithmétique BCD
C’était un projet amusant
https://github.com/ncw/ccforth/tree/master/examples/gameboy
Ce que j’ai préféré, c’est l’émulateur en C de 366 octets capable d’exécuter Linux et Doom [0]
Cette machine virtuelle implémente un OISC, c’est-à-dire un ordinateur à instruction unique [1]
[0] https://github.com/ioccc-src/winner/blob/master/2025/cable/p...
[1] https://github.com/ioccc-src/winner/blob/master/2025/cable/R...
J’aurais pu écrire une foule de routines de bibliothèque standard comme l’ouverture de fichiers, l’exécution de commandes shell,
strstr,strcpy, et j’ai honnêtement aussi implémenté des choses inutiles dans le cadre de l’apprentissage. Par exemple,print(getenv("HOME"))fonctionne. Mais je me suis vite rendu compte qu’il me fallait des programmes d’exemple pour les tests et pour frimer un peuDonc, naturellement, le premier vrai programme que j’ai implémenté a été un interpréteur brainfuck. Grâce à ça, mon langage est désormais indirectement Turing-complet
La version initiale mettait 9 minutes à produire la sortie du célèbre programme mandelbrot, donc j’ai fait plusieurs optimisations, puis ajouté la prise en charge des instructions switch/case pour accélérer encore. Maintenant, il produit la même sortie en 2 minutes ; il reste de la marge d’amélioration, mais c’est déjà un bon progrès
J’ai trouvé très satisfaisante cette approche un peu tricheuse qui consiste à implémenter un autre langage à l’intérieur du mien. Bien sûr, tout cela est fait pour le plaisir et l’apprentissage, et ce n’est pas conçu pour être utilisé sérieusement par qui que ce soit, moi y compris
https://github.com/skx/s-lang
Ici, il est écrit Set m[b] = m[b] - m[a]
Ensuite, cela renvoie vers l’implémentation de référence sur GitHub [2], où il est indiqué qu’il suffit de la note griffonnée sur une serviette [3]. Cette approche consiste à diviser par 4 toutes les valeurs lues, et l’implémentation de référence [4] le confirme. Mais on ne voit pas clairement pourquoi 4 a été choisi plutôt que 2. On dirait qu’un bit est gaspillé. Je me demande si ce bit était nécessaire ou s’il a été réservé pour de futures extensions
L’implémentation d’origine ne divisait pas par 4, et cela semble avoir été ajouté plus tard, mais je ne vois pas pourquoi c’était nécessaire, en dehors du fait que cela facilite un peu la génération de code LLVM. Pour vérifier si le système décrit devient impossible sans cette division par 4, il faudrait sans doute parcourir beaucoup d’exemples. Peut-être qu’on ne pouvait accéder qu’aux adresses paires et que, comme le PC s’incrémente de 3 à chaque fois, référencer des emplacements de code devenait de toute façon pénible
L’implémentation de référence se comporte de façon magique quand on accède à l’emplacement 64 : elle écrase alors les positions 64 à 67 avec l’heure actuelle. C’est mentionné dans l’explication sur la serviette, mais pas dans la description de la page principale
Les deux descriptions mentionnent aussi l’adresse magique -1, donc il est étrange de ne pas avoir implémenté l’horloge UTC dépendante de l’implémentation avec une adresse négative, plutôt que de corrompre de la mémoire librement utilisable
Les deux descriptions mentionnent aussi un mécanisme d’interruptions de timer périodiques, et c’est également dommage. Les adresses 0 et 1 sont réutilisées respectivement pour la position du gestionnaire d’interruption et pour le PC sauvegardé, ce qui oblige à écraser l’emplacement 0, point d’entrée initial, juste après le démarrage du programme
[1] https://eternal-software.org/
[2] https://github.com/adriancable/eternal
[3] https://github.com/adriancable/eternal/blob/main/docs/napkin...
[4] https://github.com/adriancable/eternal/blob/main/vm/vm.c
https://www.youtube.com/live/MoWCwZx1Swc?si=eIOlRsKWNKRVRZeB...
Au cas où certains se poseraient la question : l’IOCCC autorise explicitement l’usage des LLM dans ses directives
"IOCCC has a rich history of remarkable winning entries created by authors who skillfully employed various techniques (often their own tools) to develop their code."
L’inverse est intéressant aussi. À quel point un LLM peut-il correctement deviner la fonction d’un code obfusqué ?
Je trouve bien que l’IOCCC accepte du code qui a pu être créé avec l’aide de machines. Cela rend la valeur des œuvres gagnantes entièrement faites à la main encore plus grande
https://www.ioccc.org/2025/rules.html
Je pense qu’on parle ici de générateurs de code sur mesure. Le texte mentionne explicitement une « riche histoire » ; si cette formulation inclut aussi l’époque d’avant l’IA, je ne vois pas pourquoi il faudrait y lire une référence à l’IA
Le site lui-même est aussi obfusqué, donc trouver le code source C n’est pas du tout facile
J’aimerais bien que l’Underhanded C Contest revienne. Ce n’est pas pour rabaisser les participants d’Obfuscated C, mais je trouvais ça bien plus intéressant pour ma part
Il y a une référence à Frieren ici ! [1]
https://www.ioccc.org/2025/yang2/index.html
L’un des protagonistes s’appelle Fern, et utilise presque exclusivement le sort d’attaque classique Zoltraak
[1] https://en.wikipedia.org/wiki/Frieren
Nom d’un chien, l’une des œuvres gagnantes contient mon implémentation du Jeu de la vie sur Game Boy !
./try.shune option permettant aux utilisateurs de le télécharger depuis GitHub et de le testerJ’ai passé mon premier entretien pour un stage en 2000, pour rejoindre une équipe de programmeurs C. Les recruteurs m’ont montré une ancienne œuvre gagnante, puis ont quitté la salle en me disant de revoir le code. Ils sont revenus cinq minutes plus tard et m’ont demandé
– Alors ?
– Désolé, je vous ai fait perdre votre temps. Je n’y comprends absolument rien
Et là tout le monde a éclaté de rire, puis on est passé aux formalités d’embauche
Je me demande s’ils taquinent encore les stagiaires comme ça aujourd’hui. Ça me fait toujours rire quand je repense à mon désarroi à l’époque
Ooooh ! L’IOCCC est de retour !
Tout mon amour aux organisateurs <3 <3 <3 merci de faire vivre l’IOCCC, et j’espère qu’il ne disparaîtra plus jamais
Attendez, je ne comprends pas bien
Donc l’Obfuscated C Code Contest, c’est permis, mais pas les Capture the Flag ? À cause de l’IA ?
https://twit.tv/posts/tech/ai-disrupts-capture-flag-what-mea...
Si la question est : « On ne pourrait pas imaginer une idée astucieuse, puis demander à une IA de l’implémenter dans les contraintes de l’IOCCC ? », je pense qu’à l’heure actuelle les outils d’IA ne sont pas encore capables d’atteindre un niveau que des juges humains jugeraient vraiment valable