3 puntos por GN⁺ 2023-12-24 | 1 comentarios | Compartir por WhatsApp

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

 
GN⁺ 2023-12-24
Opiniones de Hacker News
  • Hay un ejemplo similar en el mundo de TeX: xii.tex:

    • Si pones código de apariencia compleja en un documento TeX y ejecutas 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:

    • Ver cómo un código difícil de entender produce el resultado deseado despierta la curiosidad sobre si existirá un programa más corto que produzca el mismo resultado y cómo encontrarlo.
  • Recibí este código cuando se publicó originalmente, pero con otro nombre de archivo:

    • Estaba guardado con el nombre "carol.c", y al compilarlo y ejecutarlo en un sistema moderno, el compilador muestra mensajes de advertencia.
  • El IOCCC (International Obfuscated C Code Contest) sigue muy activo incluso en 2023:

    • Hay una excelente explicación sobre el IOCCC, y se puede ver en www.ioccc.org.
  • 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:

    • Hay un ejemplo de programa que genera repetitivamente la canción acumulativa "Old Lady Swallowed a Fly". Se puede ver en rosettacode.org.
  • 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:

    • Recuerdo la experiencia de haber visto este código por primera vez en una clase del profesor en 2022.
  • En la universidad, este código aparecía en material impreso para aprender C, y recuerdo haberlo tecleado yo mismo una vez:

    • Al aprender el lenguaje C, fue una experiencia memorable escribir realmente este código a mano.
  • Este código usa una versión muy antigua del lenguaje C:

    • Se comenta que la firma de la función main usa 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:

    • Da la impresión de que el historial de premios del diseñador de Perl en el IOCCC ayuda a explicar ciertas características del lenguaje Perl.