Análisis del código xmas.c
- El código en C llamado xmas.c, creado en 1988, ganó el Concurso Internacional de Código C Ofuscado.
- Este código es más pequeño que su resultado de salida y propuso una nueva dirección para los estándares de compresión de texto.
- Al compilarlo y ejecutarlo, funciona sin parámetros y, curiosamente, parece como si alguien hubiera golpeado al azar las teclas de una máquina de escribir.
Salida del código
- Al ejecutar el código, se imprimen las letras de la canción "Los doce días de Navidad".
- El contenido de salida enumera los regalos desde el primer día de Navidad hasta el duodécimo.
Análisis
- Para entender el código, primero hay que reescribirlo en una forma más legible.
- Durante ese proceso, se revela que descifra un cifrado por sustitución usando cadenas específicas.
- La variable
t cumple un papel importante al controlar la dirección de la recursión.
- El código descifra el cifrado por sustitución mediante recursión e imprime la letra de la canción de Navidad.
Simplificación
- Una vez que se entiende el programa, puede simplificarse usando algunos bucles y funciones de la biblioteca de cadenas de C.
- Al final, el código simplificado puede reducirse a simplemente imprimir la letra de la canción.
Opinión de GN⁺
- Creatividad al máximo: el código xmas.c es un gran ejemplo de cómo escribir código ofuscado usando un cifrado por sustitución y recursión. Muestra cómo puede expresarse la creatividad en la programación.
- Valor educativo: analizar y entender este código puede ser un buen ejercicio para que ingenieros de software principiantes mejoren sus habilidades de programación.
- Diversión e interés: este código ofrece una oportunidad para descubrir la diversión de programar y experimentar el placer de resolver problemas complejos.
1 comentarios
Opiniones de Hacker News
Hay un ejemplo similar en el mundo de TeX:
xii.tex:pdftex, puedes obtener un resultado distinto al esperado. Se puede ver en shreevatsa.net.Este código hace pensar en la complejidad de Kolmogórov:
Recibí este código cuando se publicó originalmente, pero con otro nombre de archivo:
El IOCCC (International Obfuscated C Code Contest) sigue muy activo incluso en 2023:
Si desactivas las advertencias, también funciona en el repositorio de código más reciente (
trunk):También hay algo parecido en Rosetta Code:
Tengo un buen recuerdo de cuando, en el último semestre de la universidad, el profesor mostró este fragmento de código al inicio de la clase:
En la universidad, este código aparecía en material impreso para aprender C, y recuerdo haberlo tecleado yo mismo una vez:
Este código usa una versión muy antigua del lenguaje C:
mainusa el estilo antiguo K&R, así que hoy en día probablemente ya no compilaría.Una de las cosas interesantes es la relación entre que Larry Wall haya ganado el IOCCC dos veces y que haya diseñado Perl: