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?
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?
Respuestas:
¡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.
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); }