python quine

python - ¿Qué son las quines? ¿Algún propósito específico para tenerlos?



(10)

Una quine es un programa de computadora que produce una copia de su propio código fuente como su única salida.

Todavía no he visto un uso práctico para uno, pero estoy seguro de que hay uno por ahí en alguna parte.

Ejemplo de Python ( encontrado aquí )

print (lambda s:s+`s`+'')'')("print (lambda s:s+`s`+'')'')(")

C Ejemplo ( encontrado aquí

#include <stdio.h> int main(int argc, char** argv) { /* This macro B will expand to its argument, followed by a printf command that prints the macro invocation as a literal string */ #define B(x) x; printf(" B(" #x ")/n"); /* This macro A will expand to a printf command that prints the macro invocation, followed by the macro argument itself. */ #define A(x) printf(" A(" #x ")/n"); x; /* Now we call B on the text of the program up to this point. It will execute the command, and then cause itself to be printed. */ B(printf("#include <stdio.h>/n/nint main(int argc, char** argv)/n{/n/* This macro B will expand to its argument, followed by a printf/n command that prints the macro invocation as a literal string *//n#define B(x) x; printf(/" B(/" #x /")//n/");/n/n/* This macro A will expand to a printf command that prints the/n macro invocation, followed by the macro argument itself. *//n#define A(x) printf(/" A(/" #x /")//n/"); x;/n/n/* Now we call B on the text of the program/n up to this point. It will execute the command, and then cause/n itself to be printed. *//n")) A(printf("/* Lastly, we call A on a command to print the remainder of the program;/n it will cause itself to be printed, and then execute the command. *//n}/n")) /* Lastly, we call A on a command to print the remainder of the program; it will cause itself to be printed, and then execute the command. */ }

Me encontré con este término: Quine (también llamado programas de reproducción automática). Sólo quería saber más sobre él. ¿Cómo se escribe una quine y se usan en cualquier lugar o son solo un ejercicio para divertirse?

Comencé con Python, y podría intentar escribir uno en Python. ¿Alguna sugerencia?


¿Para qué se usan los quines? Programación de ejercicios y virus.

Un virus debe replicarse de alguna manera, y una forma es convertirlo en una quine. Digamos que un programa antivirus hipotético marcaría cualquier proceso que lea su propio binario en la memoria (para pasarlo a la víctima); la forma de evitar eso sería tener salida por sí misma.

Tenga en cuenta que una quina en código de máquina no requeriría compilación.


Aquí hay uno en Python (es feo; lo escribí para probarlo). Ni siquiera sabía que esto se llamaba una quine en aquel entonces.

def e(s): print s[:42]+s[42:].replace(''#'',''"''); print ''e("""''+s+''""")'' e("""def e(s): print s[:42]+s[42:].replace(''#'',''"''); print ''e(###''+s+''###)''""")

Ah, y para responder a tu otra pregunta: los Quines son totalmente inútiles.


Como explicaron otros, los quines son programas que reproducen copias exactas de sí mismos.

Con respecto a las aplicaciones, si piensa que el ADN codifica la lógica para interpretarse y reproducirse a sí mismo, la respuesta es bastante sencilla, sin el concepto de quines no estaríamos aquí y nunca podríamos crear artificiales (auto-reproducibles). ) vida.


Como mínimo, las quines son programas que producen su propia fuente como su salida. Son un paso necesario para construir la prueba de Gödel sobre la incompletitud .

Si esto constituye un uso práctico es algo sobre lo que no ofrezco ningún comentario.


Escribí mi primer Quine en 1979, en Fortran. El otro día pensé de forma aleatoria acerca de Quines en PHP y sentí como si publicara la misma Q que el OP, pero siendo un buen chico, primero verifiqué la Q&A D / B. De todos modos para la posteridad aquí está mi PHP (cli) quine. Me interesaría cualquier variante más corta. :-)

<?php $x=''<?php $x=0;echo strtr( $x, array(chr(39).$x.chr(39)));'';echo strtr( $x, array(chr(39).$x.chr(39)));

109 bytes, pero con el último CR cortado. Eso sin contar el "tramposo":

<?php readfile( __FILE__);

Y este wiki de QuineProgram cita uno aún más corto:

<?php printf($a=''<?php printf($a=%c%s%c,39,$a,39);'',39,$a,39);



Este es mi ejemplo favorito de C

char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}

Dos cosas que aprendí de ella:

  1. No se requiere espacio en blanco, pero ayuda a la legibilidad
  2. La función prinftf es realmente poderosa.

Los quines son inútiles en un sentido práctico, pero son un gran ejercicio para ayudarte a aprender más sobre un idioma.

Aquí hay una muy concisa en python:

a=''a=%r;print a%%a'';print a%a


No puedo presentar ningún dato para decir que escribir una quine o dos ha ampliado mi mente o me ha hecho un mejor programador. Pero es divertido hacerlo, al menos las primeras veces. De todos modos, usted preguntó acerca de cómo escribir uno. Puedo señalarle algunas referencias bien escritas:

Craig Kaplan tiene un buen artículo que describe cómo producir en realidad quines:

  • La búsqueda de código de auto-documentación
    • Este informe examina el problema de escribir un programa de autodocumentación: un programa que, cuando se ejecuta, se produce como salida. El problema se examina desde el punto de vista de la auto-referencia, la propiedad que debe exhibir un programa de auto-documentación. El informe procede de los primeros programas que no funcionan correctamente, a través de programas sucesivamente sofisticados que abordan una solución, a programas autodocumentados de trabajo. Luego retrocede un poco y muestra cómo algunos programas parecen hacer trampa y aun así ajustarse a la definición de un programa de auto-documentación, sugiriendo mejoras a esa definición. En cada paso, el informe aborda cómo los programas dados demuestran la relación sutil entre la programación de la computadora y la auto-referencia.

También puede encontrar la lectura interesante de "Quines (programas de autorreplicación) de David Madore " .

Finalmente, si desea ver implementaciones, consulte la página de Quine, donde puede encontrar quines en varios idiomas y otros temas relacionados.