3 points par GN⁺ 8 시간 전 | 1 commentaires | Partager sur WhatsApp
  • 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.html de 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.html de 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.c ou 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
    Publicité

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 :
  • 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
    Publicité

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 clang ou gcc
  • 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 :

Lauréats du 29e IOCCC 2025

1 commentaires

 
GN⁺ 8 시간 전
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

    • Ravi que ça t’ait plu :-) Si tu veux voir comment c’est fait, l’original est ici
      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 int que 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 utile
      Une 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
      https://github.com/ncw/ccforth/tree/master/examples/gameboy
    • Super ! Et moi pendant ce temps-là, je ne fais que tripoter du CSS et du PHP
    • Faire en sorte que le code ressemble à une image est un cliché assez courant dans les concours de programmation obfusquée
  • 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...

    • Ces dernières semaines, je créais mon propre petit langage de programmation compilé en assembleur Linux/amd64
      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 peu
      Donc, 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
    • Waouh ! Et ils ont réalisé une implémentation très intéressante d’une variante de SUBLEQ Turing-complète

      Cette VM implémente un OISC, c’est-à-dire un One Instruction Set Computer. Cette instruction prend trois opérandes signés de 32 bits a, b, c et exécute le programme sur la mémoire m[] de la façon suivante :
      1 Le PC (program counter) commence à 0
      2 Récupérer l’instruction suivante, c’est-à-dire les opérandes signés de 32 bits a, b, c
      3 Si le bit de poids faible de l’un des opérandes est activé, supprimer ce bit et remplacer cet opérande par m[operand], c’est-à-dire la valeur déréférencée à cette adresse
      4 Définir m[b] = m[b] - m[a]
      5 Si m[b] est inférieur ou égal à 0, définir le PC à c ; sinon, incrémenter le PC de 3 mots
      6 Revenir à l’étape 2

    • J’aime bien l’idée, mais l’Eternal Software Initiative liée [1] est un peu déroutante. Il existe plusieurs versions de la description de cette instruction de décodage, et elles se contredisent
      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
    • Je l’ai téléchargé et compilé, et je peux dire sans hésiter que c’est la chose la plus impressionnante que j’aie vue jusqu’à présent
    • La vidéo est ici
      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."

    • Je suis plutôt du côté non-IA, mais dans ce cas je trouve ça intéressant. Surtout parce qu’il n’y a pas tant de code C obfusqué en ligne, et qu’il est aussi difficile pour un LLM d’inférer l’intention à partir de vrai code. Je me demande si quelqu’un a déjà vu une participation aidée par un LLM
      L’inverse est intéressant aussi. À quel point un LLM peut-il correctement deviner la fonction d’un code obfusqué ?
    • Cela a surtout un impact sur les juges. C’est en quelque sorte ouvrir la porte à un déversement de code médiocre, mais vu la nature du concours, les juges me semblent tout à fait capables de distinguer du code intéressant d’un code de faible qualité
      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
    • Donc c’est devenu un concours de gymnastique pour LLM ?
    • Si l’IA est incluse dans les « outils », alors la règle 7 devient contradictoire
      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

    • Il suffit d’aller directement sur https://www.ioccc.org/2025/#inventory
    • C’est vraiment difficile à parcourir. On ne comprend pas bien ce qu’est le concours, et on dirait que le site a été conçu en partant du principe que vous le connaissez déjà
    • La première phrase mène à la section listant les gagnants, et en haut à droite de chaque entrée gagnante il y a un lien C code
  • 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 !

    • Après avoir créé l’émulateur, j’ai fouillé GitHub pour trouver des jeux pouvant tourner dans la limite des 32 KB. Je suis tombé sur le vôtre, merci :-) J’ai ajouté au script ./try.sh une option permettant aux utilisateurs de le télécharger depuis GitHub et de le tester
  • J’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...

    • Les Capture the Flag ont des objectifs clairs, contrairement à l’Obfuscated C Contest. Je comprends qu’on puisse parler de progrès de l’IA dans des compétitions orientées objectif, mais dans un concours ouvert où entre aussi en jeu un sens artistique, j’ai du mal à voir ce qu’il faut considérer comme un progrès
      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