Programa Quine repetido

8

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?

huyichen
fonte
Você poderia fornecer mais informações sobre o que é um programa Quine? (Também por favor leia as FAQ e como pedir uma boa pergunta se você ainda não leu ainda.)
Kaveh
@ Kaveh: Voltei a adicionar a marca lógica. Quines se originam na lógica e no estudo da auto-referência, auto-aplicação, etc., portanto parece apropriado.
Por Vognsen
Um ótimo recurso sobre quines
Sylvain Peyronnet
3
Aliás, não creio que seja necessário escrever o código de um programa assim, a existência segue facilmente do teorema do ponto fixo de Kleene .
Kaveh
1
@ Kaveh: Sim, suspeito que o termo "programa Quine" tenha sido cunhado por Hofstadter no GEB (ele certamente cunhou o verbo "to aritmoquine" ). Mas não tenho 100% de certeza. Eu recomendo vivamente que todos leiam GEB (pelo menos, todos interessados ​​em Lógica e / ou Inteligência Artificial). IMHO, é uma obra-prima.
Giorgio Camerani 01/10/10

Respostas:

9

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.

Per Vognsen
fonte
Muito bem feito!
Arnab
9


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

aurevoirlesenfants
fonte
3

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); }
Mike B.
fonte