Um Quine é um programa de computador que produz uma cópia do seu próprio código-fonte como sua única saída. Existe algum programa Quine que pode se imprimir n vezes, com n especificado de alguma forma no programa?
Um Quine é um programa de computador que produz uma cópia do seu próprio código-fonte como sua única saída. Existe algum programa Quine que pode se imprimir n vezes, com n especificado de alguma forma no programa?
Respostas:
Pergunta divertida! Como base, usarei este haskell quine que encontrei na Wikipedia:
main=putStr(p++show(p))where p="main=putStr(p++show(p))where p="
Você pode imprimir duas cópias de si mesmo, substituindo as ocorrências de p ++ show (p) por p ++ show (p) ++ p ++ show (p). Se você perceber o porquê, o padrão para obter repetições variáveis deve ser claro.
Eu usarei a seguinte função que calcula a enésima iteração de f em x:
iterateN n f x = (iterate f x) !! n
Suponho que esteja disponível como uma função de biblioteca. Você pode incorporar facilmente sua definição diretamente no quine, mas isso atrapalha a apresentação sem uma boa razão. Agora o resto é simples:
main=putStr(iterateN 42(++(p++show(p)))[])
where p="main=putStr(iterateN 42(++(p++show(p)))[])where p="
A quebra de linha foi inserida para facilitar a legibilidade; remova-o se desejar uma replicação exata.
Aqui está outro, baseado na versão printf da 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); }`
Embora seja curto, na verdade não é tão bom, pois falta a inclusão para printf, assim como o contador deve ser especificado duas vezes. Uma versão um pouco mais longa cura os dois 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); }