- El International Obfuscated C Code Contest (Concurso Internacional de Código C Ofuscado) es una competencia de programación informática que premia el código C 'ofuscado' más creativo, artístico y difícil de leer
- Fue la segunda edición consecutiva celebrada tras la pausa de 2020 a 2024, y aunque el número de participaciones fue similar al del año pasado, la escala y la calidad de los trabajos enviados se mantuvieron en un nivel histórico
- Yusuke Endoh, Nick Craig-Wood y Don Yang lograron cada uno un hat trick al obtener 3 obras premiadas, y apareció un nuevo ganador procedente de Taiwan
- Se eligieron ganadores muy variados, como una computadora Subleq, un emulador de GameBoy y un quine de patch/diff, y además se incorporó un Fun challenge para cada obra premiada
- El anuncio de los ganadores se realizó en un show en vivo del canal de YouTube Our Favorite Universe, y el próximo IOCCC30 está previsto para finales de 2026
Punto de partida
- Los enlaces a las entradas ganadoras del IOCCC 2025 pueden consultarse en la lista de ganadores al final de la página
- El
index.htmlde cada entrada premiada ofrece la mayor parte de la información necesaria para compilar y ejecutar el programa ganador - Se puede leer el código fuente premiado para entender cómo funciona, y revisar la explicación del autor para ver más detalles
- Todas las obras ganadoras de este año pueden descargarse en forma de tarball comprimido
Observaciones generales sobre este concurso
- La cantidad y la calidad de las propuestas de IOCCC29 estuvieron cerca de máximos históricos
- IOCCC28 fue objeto de la hipótesis de que, tras una pausa de 4 años, los participantes tuvieron tiempo para pulir sus trabajos, lo que produjo una cantidad récord de envíos y una calidad superior a la habitual
- Aunque IOCCC29 fue la segunda edición consecutiva tras la pausa de 2020 a 2024, el número de envíos fue similar al del concurso anterior y la calidad general se mantuvo alta
- Desde el cierre de IOCCC28 se documentaron cuidadosamente el cierre de nuevas postulaciones, el proceso de evaluación, la selección de ganadores, la actualización del sitio web y la producción del show en vivo de Our Favorite Universe
- Esa documentación requirió tiempo y esfuerzo adicionales, pero como resultado se lograron mejoras en el funcionamiento general del IOCCC
- Unos días después del anuncio de los ganadores de IOCCC29 en el canal de YouTube de Our Favorite Universe, está previsto dividir la grabación principal en segmentos individuales
- Cerca de la parte superior del
index.htmlde cada entrada ganadora se añadirá una nueva sección de Award presentation con enlaces a los segmentos de YouTube -
Información sobre desafíos divertidos
- Este año se añadió un desafío divertido debajo de la sección “Judges’ remarks” en las obras premiadas
- Se recomienda intentar ese desafío después de entender cómo funciona una obra ganadora concreta
- Algunos desafíos son más fáciles que otros, y en ciertos casos requieren crear una versión alternativa de
prog.co de archivos relacionados - Algunos desafíos piden redactar una explicación sobre un elemento específico
- Si la sección “A fun challenge” de una obra concreta sigue marcada como still open, se puede contribuir enviando un GitHub pull request
- Incluso si el desafío ya está cerrado, si se considera que existe una solución mejor, también se puede enviar un GitHub pull request
- Si los jueces del IOCCC están de acuerdo en que se trata de una mejor solución, será considerada
- Si hay una mejora mejor para un desafío divertido de una obra ganadora, se puede enviar un GitHub pull request para revisión de los jueces del IOCCC
-
Reglas y lineamientos de este concurso
- La versión final de las reglas aplicadas en esta edición fue 2025 rules, versión 29.15 2025-12-02
- La versión final de los lineamientos aplicados en esta edición fue 2025 guidelines, versión 29.08 2025-12-02
- Las reglas y lineamientos de IOCCC29 fueron ampliamente renovados respecto a ediciones anteriores
- Varios voluntarios aportaron ediciones útiles, revisiones de redacción, consolidación y mejoras generales de estructura para los jueces del IOCCC
-
Hacia el próximo concurso
- Está previsto que IOCCC30 arranque hacia finales de 2026
- IOCCC30 se desarrollará durante un periodo similar y está previsto que concluya hacia el final del primer trimestre de 2027
- Mientras se realizan las tareas necesarias para abrir IOCCC30, también se planea documentar los procedimientos internos igual que al cierre de IOCCC29
- Aproximadamente entre 2 y 3 semanas después de publicar las obras ganadoras de IOCCC29, y tras procesar algunos de los pull requests iniciales del árbol de directorios de 2025, los IOCCC Judges planean unas IOCCC vacation
- Tras la publicación de los ganadores de IOCCC28 también se había planeado una IOCCC vacation, pero se invirtió mucho tiempo en corregir errores y hacer mejoras en el repo de mkiocccentry, y cuando el repositorio se estabilizó ya había llegado el momento de abrir IOCCC29
- Esta vez, después de terminar la IOCCC vacation posterior a IOCCC29, está previsto trabajar en los PRs del repo de mkiocccentry
Notas sobre algunas obras premiadas
- Mientras se preparaban posibles textos sobre las propuestas que llegaron a la ronda final del conjunto final de evaluación, algunas postulaciones quedaron fuera en la última etapa de la ronda final
- Varias de las entradas restantes generaron aún más admiración y una mejor valoración
- Los autores ganadores provinieron tanto de regiones que ya habían tenido autores premiados como de una nueva región en IOCCC29, con jingp49 desde Taiwan
- Tres autores obtuvieron premio con tres entradas cada uno, completando Hat trick) de Hat-tricks
- Algunas de las obras ganadoras más destacadas de IOCCC29 incluyen lo siguiente
- 2025/cable: computadora Subleq
- 2025/cesmoak: Fortran en tarjetas perforadas de agujero negro
- 2025/endoh3: quine de patch/diff
- 2025/jhshrvdp: juego casi rogue-like
- 2025/jingp49: secuencia Dr. WHO
- 2025/ncw1: emulador de GameBoy
- 2025/tompng: generador de sonidos del mar
- 2025/uellenberg: quine pong
- 2025/yang2: codificación Zoltraak
- La lista anterior es solo una parte de las muchas obras ganadoras sobresalientes de IOCCC29
-
Notas sobre algunas propuestas que no ganaron
- Hubo muchas propuestas excelentes que estuvieron muy cerca de la selección final pero no recibieron premio
- Se valora el esfuerzo que cada autor puso en su entrada, pero no es posible premiar basándose solo en el esfuerzo
- El código enviado a IOCCC29 que no ganó puede pulirse y volver a enviarse a IOCCC30
- Al menos una de las obras ganadoras de IOCCC29 es una versión mejorada de código que no ganó en un concurso anterior
-
Palabras de ánimo para quienes no ganaron este año
- Las propuestas de este año al IOCCC implicaron mucho esfuerzo, pero no se puede dar premio a todas
- Dar premios a todas quitaría significado a las propuestas consideradas las mejores y merecedoras de ganar
- Incluso si una propuesta de la ronda final era lo bastante buena como para ser ganadora, podría quedar detrás de otra similar pero ligeramente mejor
- Si se considera que una propuesta está en esa situación, se recomienda enviar una versión mejorada al próximo IOCCC
- Existen propuestas que alcanzaron nivel de ganadoras tras varias rondas de revisión y reenvío
- También es posible probar un tipo de propuesta completamente distinto en el próximo IOCCC
- Si no se planea mejorar y reenviar una entrada no ganadora al próximo IOCCC, puede hacerse pública
Compilación y ejecución de las obras ganadoras
- Puede que algunos compiladores de C no produzcan resultados suficientemente buenos
- Si el compilador que estás usando no funciona bien, puedes intentar compilar con una versión reciente de
clangogcc - Si surge algún problema al compilar o ejecutar una obra ganadora, se puede consultar el siguiente FAQ
- Para más información sobre envíos de correcciones, se puede consultar el siguiente FAQ
- How to submit a fix: cómo enviar una corrección para una entrada
- Update author information: cómo corregir o actualizar la información de autor del IOCCC
Obras ganadoras de la 29.ª edición del IOCCC 2025
- La colección completa de ganadores está disponible en descarga de ganadores 2025
- 2025/ayu: Premio IMO
- 2025/cable: Mejor premio al emulador imaginario
- 2025/cesmoak: Premio al espacio retro
- 2025/diels-grabsch: Mejor premio al one-liner
- 2025/dogon: Premio al que es consistentemente constante
- 2025/endoh1: Premio al más probable de deslumbrar
- 2025/endoh2: Premio al más probable de provocar una descarga
- 2025/endoh3: Mejor premio a la resiliencia
- 2025/ferguson: Premio opuesto
- 2025/howe: Premio al más probable de invadir
- 2025/jhshrvdp: Premio al más probable de teletransportarse
- 2025/jingp49: Premio Who won
- 2025/kurdyukov: Premio al más probable de contar
- 2025/mattpep: Premio a la opción más ofuscada
- 2025/ncw1: Mejor premio al emulador real
- 2025/ncw2: Mejor premio al emulador fraccional
- 2025/ncw3: Mejor premio al uso de Unicode
- 2025/tompng: Premio al más relajante
- 2025/uellenberg: Premio ping-pong
- 2025/yang1: Premio compuesto
- 2025/yang2: Premio a la palabra más mágica
- 2025/yang3: Premio INABIAF
1 comentarios
Comentarios en Hacker News
El código del emulador de GameBoy incluso llega a verse como un GameBoy. Es una locura digna de un aplauso lento y, personalmente, es mi favorito entre los trabajos de este año
https://github.com/ioccc-src/winner/blob/master/2025/ncw1/pr...
El autor, Nick Craig-Wood, es quien hizo rclone
https://github.com/ncw/ioccc-gameboy
Ahí también está más o menos la versión no ofuscada. En realidad trabajé sobre esa y luego usé un programa para aplastar todos los nombres de variables y comprimirlo hasta que encajara con la forma de un GameBoy
La restricción de tamaño de la propuesta fue lo más difícil. Las propuestas del IOCCC permiten hasta 2503 caracteres sin contar espacios, y el tamaño total del código es de 4KB, lo cual es realmente poco para meter un procesador Z80 y un emulador del hardware de GameBoy
Al principio escribí un emulador completo de GameBoy en C y empecé con unos 6000 caracteres sin contar espacios. Después le dediqué unas 100 horas a ajustarlo al límite de 2503 caracteres, y durante un tiempo no estaba seguro de que fuera a caber
Puse como objetivo ejecutar Tetris. Como Tetris es un juego relativamente simple, quité funciones innecesarias, como la bandera half carry del emulador Z80 o el sistema de ventanas de la emulación de GameBoy. También forcé el código en C de una manera terrible e hice cosas con implicit int que jamás voy a olvidar. Como el verificador de reglas del IOCCC está implementado como un programa en C, también pasé tiempo haciéndole ingeniería inversa para encontrar huecos. Fue especialmente útil descubrir que ciertos operadores se contaban como un solo token
Una vez que quedó lo bastante pequeño, también había que meter juegos para ejecutar. Hice cuatro: un programa de prueba escrito en ensamblador Z80, una calculadora de pi hecha en ensamblador, un 3D tic-tac-toe hecho en C con gbdk-2020 y un programa de ajedrez hecho en C. También descubrí que bastantes juegos de código abierto corrían en este emulador, así que añadí un descargador cuando fue posible. Sorprendentemente, no había muchos juegos que usaran aritmética BCD
Fue un proyecto divertido
https://github.com/ncw/ccforth/tree/master/examples/gameboy
Lo que más me gustó fue un emulador de programa en C de 366 bytes capaz de ejecutar Linux y Doom [0]
Esta máquina virtual implementa un OISC, es decir, una computadora de una sola instrucción [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...
Podría haber escrito un montón de rutinas de biblioteca estándar como abrir archivos, ejecutar comandos del shell,
strstr,strcpy, y, siendo sincero, también implementé cosas innecesarias para el proceso de aprendizaje. Por ejemplo,print(getenv("HOME"))funciona. Pero pronto me di cuenta de que necesitaba programas de ejemplo para probarlo y presumirloAsí que, como era de esperarse, el primer programa real que implementé fue un intérprete de brainfuck. Gracias a eso, mi lenguaje ahora es indirectamente Turing completo
La versión inicial tardaba 9 minutos en generar la salida del famoso programa de mandelbrot, así que hice varias optimizaciones y después también agregué soporte para sentencias
switch/casepara hacerlo más rápido. Ahora puede producir la misma salida en 2 minutos, así que todavía hay margen de mejora, pero ya hubo bastante avanceMe resultó muy satisfactorio este método tramposo de implementar otro lenguaje dentro de mi lenguaje. Claro, todo esto es por diversión y para aprender, y no está hecho para que nadie, incluyéndome a mí, lo use en serio
https://github.com/skx/s-lang
Aquí dice Set
m[b] = m[b] - m[a]Luego enlaza a la implementación de referencia en GitHub [2], donde dice que solo necesitas la nota en servilleta [3]. Ahí todo valor leído se divide entre 4, y la implementación de referencia [4] también lo respalda. Pero no está claro por qué eligieron 4 y no 2. Parece que se desperdicia un bit. Me pregunto si ese bit era necesario o si quedó reservado para una posible expansión futura
La implementación original no dividía entre 4 y parece que eso se agregó después, pero no entiendo por qué fue necesario, salvo que facilite un poco la generación de código LLVM. Para comprobar si el sistema descrito sería imposible sin dividir entre 4, probablemente habría que seguir muchos ejemplos. Seguramente solo se podía acceder a direcciones pares y el PC aumenta de 3 en 3, así que referenciar ubicaciones de código debió de haber sido claramente molesto
La implementación de referencia hace magia cuando se accede a la ubicación 64 y sobrescribe las posiciones 64~67 con la hora actual. Aparece en la explicación de la servilleta, pero no en la de la página principal
Ambas explicaciones mencionan la dirección mágica -1, así que es extraño que no hayan implementado el reloj UTC dependiente de la implementación con una dirección negativa, en lugar de dañar memoria que debería poder usarse libremente
Ambas explicaciones también mencionan el proceso de interrupciones periódicas del temporizador, y eso también es una lástima. Reutiliza la dirección 0 como ubicación del manejador de interrupciones y la 1 como PC guardado, así que justo después de iniciar el programa hay que sobrescribir la ubicación 0, que es el punto de entrada inicial
[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...
Por si alguien tenía la duda: IOCCC permite explícitamente el uso de LLM en sus lineamientos
"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."
También sería interesante al revés. ¿Qué tan bien podría un LLM adivinar la función de código ofuscado?
Me parece bien que IOCCC acepte código que quizá fue hecho con ayuda de máquinas. Eso hace que el valor de las obras ganadoras hechas totalmente a mano parezca aún mayor
https://www.ioccc.org/2025/rules.html
Parece que aquí se refieren a generadores de código personalizados. Dicen explícitamente que hay una "rica historia", y si esa expresión incluye épocas en las que no existía la AI, no veo por qué habría que asumir que se refiere a AI
El propio sitio web también está ofuscado, así que encontrar el código fuente en C no es nada fácil
Ojalá volviera el Underhanded C Contest. No es por menospreciar a los participantes de Obfuscated C, pero ese me parecía muchísimo más interesante
¡Aquí hay una referencia a Frieren [1]!
https://www.ioccc.org/2025/yang2/index.html
Uno de los protagonistas es Fern, y usa casi exclusivamente el hechizo de ataque común Zoltraak
[1] https://en.wikipedia.org/wiki/Frieren
Dios mío, ¡una de las obras ganadoras incluye mi implementación del Juego de la Vida para Game Boy!
./try.shuna opción para que los usuarios puedan descargarlo de GitHub y probarloTuve mi primera entrevista para una pasantía en 2000, para unirme a un equipo de programadores en C. Los entrevistadores me mostraron una antigua obra ganadora, me dijeron que la revisara, y salieron del cuarto. Volvieron unos 5 minutos después y preguntaron
– ¿Y bien?
– Perdón, les hice perder el tiempo. No entiendo absolutamente nada
Entonces todos se soltaron a reír y dijeron que empezáramos el proceso de contratación
Me pregunto si todavía les hacen este tipo de bromas a los pasantes. Todavía me da risa acordarme de lo confundido que estaba
¡Oooh! ¡IOCCC está de vuelta!
Mucho cariño para los organizadores <3 <3 <3 gracias por mantener vivo IOCCC, y ojalá nunca vuelva a desaparecer
Espera, no entiendo muy bien
¿Entonces sí puede haber Obfuscated C Code Contest pero no Capture the Flag? ¿Por culpa de la AI?
https://twit.tv/posts/tech/ai-disrupts-capture-flag-what-mea...
Si la pregunta es "¿no podrías tener una idea ingeniosa y luego pedirle a la AI que la implemente dentro de las restricciones de IOCCC?", yo diría que las herramientas de AI actuales todavía no pueden lograr eso a un nivel que jueces humanos consideren valioso