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