Programa repetido de Quine


8

Un Quine es un programa de computadora que produce una copia de su propio código fuente como su única salida. ¿Hay algún programa de Quine que pueda imprimirse n veces, con n especificado de alguna manera en el programa?


¿Podría por favor proporcionar más información sobre qué es un programa Quine? (También lea las preguntas frecuentes y cómo hacer una buena pregunta si aún no ha leído).
Kaveh

@Kaveh: volví a agregar la etiqueta lógica. Las quines se originan en la lógica y el estudio de la autorreferencia, la aplicación propia, etc., por lo que parece apropiado.
Según Vognsen el

Un gran recurso sobre quines: nyx.net/~gthompso/quine.htm
Sylvain Peyronnet

3
Por cierto, no creo que sea necesario escribir el código de dicho programa, la existencia se deduce fácilmente del teorema del punto fijo de Kleene .
Kaveh

1
@Kaveh: Sí, sospecho que el término "programa Quine" ha sido acuñado por Hofstadter en GEB (ciertamente acuñó el verbo "aritmoquina" ). Pero no estoy 100% seguro. Recomiendo sinceramente a todos que lean GEB (al menos, todos los interesados ​​en la lógica y / o la inteligencia artificial). En mi humilde opinión, es una obra maestra.
Giorgio Camerani

Respuestas:


9

¡Pregunta divertida! Como base, usaré esta quina de Haskell que encontré en Wikipedia:

main=putStr(p++show(p))where p="main=putStr(p++show(p))where p="

Puede hacer que imprima dos copias de sí mismo reemplazando las apariciones de p ++ show (p) con p ++ show (p) ++ p ++ show (p). Si ve por qué, el patrón para lograr la repetición variable debe ser claro.

Usaré la siguiente función que calcula la enésima iteración de f en x:

iterateN n f x = (iterate f x) !! n

Asumiré que está disponible como una función de biblioteca. Puede incrustar fácilmente su definición directamente en la quine, pero eso saturaría la presentación sin una buena razón. Ahora el resto es simple:

main=putStr(iterateN 42(++(p++show(p)))[])
  where p="main=putStr(iterateN 42(++(p++show(p)))[])where p="

El salto de línea se insertó para facilitar la legibilidad; elimínelo si desea una autorreplicación exacta.


¡Muy bien hecho!
arnab

9


(Φi)φ(k)keφ(k)=Φe(k)fΦf(k)=Φe(k)=φ(k)ksΦf(s)=ΦsΦss


3

Aquí hay otro, basado en la versión printf en wikipedia:

main() { int i=5; char *s="main() { int i=5; char *s=%c%s%c; while (i--)
  printf(s,34,s,34); }"; while (i--) printf(s,34,s,34); }`

Aunque es breve, en realidad no es tan agradable, ya que carece de la inclusión de printf, y el contador debe especificarse dos veces. Una versión un poco más larga cura ambos problemas:

#include <stdio.h>
#define k 5
main() { int i=k; char *s="#include <stdio.h> %c#define k %d%cmain() { int i=k;
  char *s=%c%s%c; while (i--) printf(s,10,k,10,34,s,34); }";
  while (i--) printf(s,10,k,10,34,s,34); }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.