Finden Loch 1 hier .
Erstellen Sie eine Quine, die beim Ausführen mehrmals einen eigenen Quellcodeblock ausgibt. Tatsächlich muss es n-mal ausgegeben werden, wobei n in der nächsten Primzahl steht.
Ich denke, ein Beispiel zeigt es am besten.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Jedes Programm gibt seinen Basis- "Block" (also [MEIN QUINE]) die nächste Primzahl aus .
Eingebaute Funktionen zum Berechnen, ob eine Zahl eine Primzahl ist (wie eine isPrime-Funktion) oder zum Bestimmen der nächsten Primzahl (wie eine nextPrime () -Funktion) sind nicht zulässig.
- Dies bedeutet, dass Funktionen zum Auflisten der Anzahl der Teiler nicht zulässig sind
- Funktionen, die die Primfaktorisierung zurückgeben, sind ebenfalls nicht zulässig
Dies sollte eine echte Quine sein (mit Ausnahme eines gewissen Spielraums, siehe nächster Punkt), daher sollten Sie Ihren eigenen Quellcode nicht lesen.
Da Sprachen wie Java und C # bereits im Nachteil sind, müssen Sie keinen vollständig funktionierenden Code ausgeben. Wenn es in eine Funktion (die aufgerufen wird) eingefügt und das nächste Quine ausgegeben werden könnte, sind Sie gut.
Dies ist Code-Golf, also gewinnt der kürzeste Code!
Antworten:
CJam, 31 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Idee
Um die Primalität zu überprüfen, verwenden wir den Satz von Wilson , der besagt, dass eine ganze Zahl n> 1 genau dann eine Primzahl ist, wenn (n - 1)! ≡ -1 (mod n) , was genau dann zutrifft, wenn (n - 1)! + 1% n == 0 .
Code
quelle
mp
(ist Prime?) existiert jetzt, also könnte man in der neuesten Version von CJam dies ein bisschen mehr Golf spielen.CJam,
3635 BytesDies kann
definitivweiter Golf gespielt werden.Wie es funktioniert:
Danke an Martin, der mich an den
]W=
Trick erinnert hat :)Probieren Sie es hier online aus
quelle
Mathematica,
248222 BytesBearbeiten: Die Verwendung einer prim-bezogenen Funktion wurde korrigiert, aber auch das Quining etwas verbessert.
Edit: Danke an Dennis, der mich mit Wilsons Theorem bekannt gemacht hat.
Dies setzt voraus, dass der Kernel zwischen nachfolgenden Durchläufen des Quines beendet wird (oder zumindest
n
zurückgesetzt wird), da ern
nicht definiert werden muss, bevor die erste Instanz von ausgeführt[MyQuine]
wird.Dies kann wahrscheinlich stark verkürzt werden, aber ich habe nicht viel Erfahrung mit Quines, insbesondere in Mathematica.
Hier ist eine Erklärung:
Dies macht nichts, aber wenn es am Ende des vorherigen Quines verkettet wird, multipliziert es das Ergebnis des letzten Ausdrucks mit
1
(was ein No-Op ist) und das Semikolon unterdrückt die Ausgabe. Dies stellt sicher, dass nur die letzte Kopie[MyQuine]
etwas druckt.Diese initialisiert ,
n
um1
in der ersten Kopie[MyQuine]
und erhöht sie dann1
in jeder weiteren Kopie - also diese nur zählt , wie viele Kopien gibt es inn
.Springe jetzt bis zum Ende:
Dies findet die nächste Primzahl unter Verwendung des Wilsonschen Theorems .
Dies ist die eigentliche Quine. Es werden
NextPrime@n
Kopien des Codes selbst erstellt. Es ist auch ein bisschen komisch. Ja, ich multipliziere dort zwei Zeichenfolgen, und nein, das hat kein aussagekräftiges Ergebnis.QUINE_PREFIX
enthält den gesamten Code vor den beiden Zeichenfolgen und denQUINE_SUFFIX
gesamten Code nach den beiden Zeichenfolgen. Normalerweise verwenden SieApply
(oder@@
), um eine Liste in eine Reihe von Argumenten umzuwandeln. Sie können jedoch jedeHead
durchApply
- z. B. Multiplikation - ersetzen . Obwohl dies ein Produkt ist, kann ich es dennoch in zwei Argumente für meine Funktion umwandeln. Diese Funktion hat:Wo
#
ist das erste Argument (die Präfixzeichenfolge),#2
ist das zweite Argument (die Suffixzeichenfolge),##
ist eine Folge beider Argumente. Ich muss voranstellen1
, um die Multiplikation##
beizubehalten - sonst würde in die Argumentliste zu splatToString
. Wie auch immer,ToString[1##,InputForm]&@@("abc"*"def")
kehrt zurück"abc"*"def"
... genau das, was ich brauche!Ich denke, mit all dem Zeug, das ich rund um das Quine brauche, wäre ein
eval
Quine auf Basis hier angemessener. Ich werde das später oder morgen untersuchen.quelle
J - 60 char
Verwendet die Next-Prime-Methode wie die anderen Antworten. (Das ist das
4 p:
bisschen.)Ein süßer kleiner J-Trick ist, dass er sich so
f :g
verhält,f
als würde er ein Argument undg
wenn zwei gegeben. Wenn Sie also schreiben, sagen Sie,f :;'a'f :;'a'f :;'a'
dass sich das so verhältf'a';'a';'a'
, was großartig ist, da es sich um eine Box-Liste handelt, deren Elemente'a'
und deren Länge die Anzahl der Vorkommen ist.Also können wir das in eine quiney Art von Dingen heben. Das, was
f
wir verwenden, sieht so aus(foo $~ bar)
, als würdefoo
der String-Teil, den wir immer wieder wiederholen , konstruiert,bar
die nächste Primzahl gefunden und mit 60 multipliziert, der Länge des Strings infoo
.quelle
Python 2.7, 214
quelle