main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
¿Cómo se reproduce después de la compilación? ¿Cuál es la función de escribir 34 en la función printf?Programa de auto reproducción
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
¿Cómo se reproduce después de la compilación? ¿Cuál es la función de escribir 34 en la función printf?Programa de auto reproducción
34 es el código de caracteres ASCII para una comilla doble (") carácter.
Para dar seguimiento a mi comentario tangencial (que era una referencia a la de Hofstadter 'Gödel Escher Bach'), esto funciona porque es una quine, que básicamente es una receta que contiene dos elementos: un kernel de datos y una operación en ese kernel, de modo que cuando la operación se completa se reproduce la receta original. Para hacerlo, el kernel y la operación son casi idénticos . En el programa que menciona, el kernel es la cadena
"main(a){printf(a=%c%s%c,34,a,34);}"
y la operación es el resto del programa:
main(a){printf(a=_____,34,a,34);}
donde ____
es el núcleo. Observará que se ven esencialmente iguales: la operación puede imprimirse utilizando el kernel como un especificador de formato (que imprime el kernel pero sin comillas, transformando así el kernel en la operación en la salida), y también alimentando el núcleo en sí mismo como un parámetro en el especificador de formato (%s
) y lo cita, produciendo el kernel en la salida.
operación (kernel citado) => núcleo sin comillas que incluye una copia del kernel, citado => que es el programa original.
un punto más: la razón por la que utiliza este negocio 34 es que mantiene la operación citando fácil mediante el uso de un núcleo sin comillas; si se trató de utilizar
"main(a){printf(a=\"%s\",a);}"
como el núcleo, con un kernel sin comillas de
main(a){printf(a="%s",a);}
que sería mucho más difícil porque a fin de citar el núcleo, que tendría que barra invertida de escape las comillas en el medio de la cadena.
¡¡Oh !! Gracias, pero ¿cómo está funcionando? –
@Arya: esta página tiene una explicación decente de cómo se puede construir 'quines': http://www.madore.org/~david/computers/quine.html Eso podría darte una idea de cómo funciona lo anterior. –
Gracias por esta página html ... :) –
(tangente: "cuando quined produce falsedad" cuando quined produce falsedad) –
Fuera de tema: Aprende algo interesante hoy. ¡Gracias! – ArjunShankar
siento por la votación negativa, pero creo que 34 es obvio, ¿no? – prongs