Wiederholtes Quine-Programm

8

Ein Quine ist ein Computerprogramm, das als einzige Ausgabe eine Kopie seines eigenen Quellcodes erstellt. Gibt es ein Quine-Programm, das sich n-mal ausdrucken könnte, wobei n auf irgendeine Weise im Programm angegeben ist?

huyichen
quelle
Könnten Sie bitte weitere Informationen zu einem Quine-Programm geben? (Bitte lesen Sie auch die FAQ und wie Sie eine gute Frage stellen können, wenn Sie noch nicht gelesen haben.)
Kaveh
@Kaveh: Ich habe das Logik-Tag erneut hinzugefügt. Quines haben ihren Ursprung in der Logik und dem Studium der Selbstreferenz, Selbstanwendung usw., so dass es naheliegend erscheint.
Per Vognsen
Eine großartige Ressource für Quines: nyx.net/~gthompso/quine.htm
Sylvain Peyronnet
3
Übrigens glaube ich nicht, dass es notwendig ist, den Code eines solchen Programms zu schreiben, die Existenz folgt leicht aus Kleenes Fixpunktsatz .
Kaveh
1
@Kaveh: Ja, ich vermute, dass der Begriff "Quine-Programm" von Hofstadter in GEB geprägt wurde (er hat sicherlich das Verb "to aritmoquine" geprägt ). Aber ich bin nicht 100% sicher. Ich empfehle jedem von Herzen, GEB zu lesen (zumindest allen, die sich für Logik und / oder künstliche Intelligenz interessieren). IMHO, es ist ein Meisterwerk.
Giorgio Camerani

Antworten:

9

Lustige Frage! Als Basis werde ich dieses Haskell-Quine verwenden, das ich auf Wikipedia gefunden habe:

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

Sie können zwei Kopien von sich selbst ausdrucken lassen, indem Sie die Vorkommen von p ++ show (p) durch p ++ show (p) ++ p ++ show (p) ersetzen. Wenn Sie sehen, warum, sollte das Muster zur Erzielung einer variablen Wiederholung klar sein.

Ich werde die folgende Funktion verwenden, die die n-te Iteration von f auf x berechnet:

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

Ich gehe davon aus, dass es als Bibliotheksfunktion verfügbar ist. Sie können die Definition problemlos direkt in das Quine einbetten, dies würde jedoch die Präsentation ohne guten Grund überladen. Jetzt ist der Rest einfach:

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

Der Zeilenumbruch wurde eingefügt, um die Lesbarkeit zu verbessern. Entfernen Sie es, wenn Sie eine genaue Selbstreplikation wünschen.

Per Vognsen
quelle
Sehr schön gemacht!
Arnab
9


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

aurevoirlesenfants
quelle
3

Hier ist eine andere, basierend auf der printf-Version auf 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); }`

Obwohl es kurz ist, ist es eigentlich nicht so schön, da es nicht für printf enthalten ist und der Zähler zweimal angegeben werden muss. Eine etwas längere Version behebt beide Probleme:

#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.
quelle