Wie wir wissen, ist ein Quine ein Programm, das seinen eigenen Quellcode ausgibt. Es ist jedoch auch möglich, ein Programm zu schreiben, das ein anderes, anderes Programm ausgibt, das das erste Programm erneut ausgibt. Zum Beispiel das Python 2-Programm
x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3
gibt beim Ausführen den folgenden Text aus:
print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""
Wenn es als Python-Programm ausgeführt wird, wird der ursprüngliche Code erneut ausgegeben. Dies wird als iterierende Quine bezeichnet . Da Sie es zweimal ausführen müssen, um den ursprünglichen Code zurückzugewinnen, haben wir die Periode 2 . Aber natürlich sind viel höhere Perioden möglich.
Ihre Herausforderung besteht darin, eine iterierende Quine mit einem möglichst langen Zeitraum in maximal 100 Byte in der Sprache Ihrer Wahl zu schreiben . (Beachten Sie, dass mein Beispiel oben nicht zu dieser Spezifikation passt, da es 119 Byte enthält, einschließlich der nachfolgenden Zeilenumbruch.)
Bitte beachten Sie die folgenden Regeln und Erläuterungen:
- Es gelten die üblichen Quine-Regeln, dh Ihr Programm kann keine Sprachfunktionen verwenden, mit denen es direkt auf seinen eigenen Quellcode zugreifen kann.
- Die iterierten Ausgaben müssen schließlich zu genau Ihrem ursprünglichen Code zurückkehren, und Sie müssen eine Demonstration oder einen Beweis dafür beifügen.
- Sie müssen auch eine Erklärung hinzufügen, warum der Zyklus so lang ist, wie Sie es sagen. Dies muss nicht unbedingt ein mathematischer Beweis sein, sondern sollte jemanden überzeugen, der mit Ihrer Sprache vertraut ist. (Diese Regel ist hier, weil ich erwarte, dass einige der Antworten sehr, sehr große Zahlen enthalten.)
- Es ist in Ordnung, etwas wie "mindestens 1.000.000 Iterationen" zu sagen, anstatt die genaue Anzahl anzugeben, solange Sie nachweisen können, dass es mindestens so lang ist. In diesem Fall wäre Ihre Punktzahl 1.000.000. Andernfalls ist Ihre Punktzahl die Periode Ihrer Quine.
- Das 100-Byte-Limit gilt nur für Ihr ursprüngliches Programm - die von ihm ausgegebenen Programme können länger sein, obwohl sie natürlich irgendwann wieder auf 100 Byte reduziert werden müssen, um Ihren ursprünglichen Code auszugeben.
- Sie können davon ausgehen, dass Ihr Computer über unendlich viel RAM und unendlich viel Laufzeit verfügt. Sie können jedoch keine Datentypen mit unbegrenzter Genauigkeit (z. B. Ganzzahlen) annehmen, wenn Ihre Sprache diese nicht hat. Sie können davon ausgehen, dass die Länge der Eingabe, die Ihr Parser verarbeiten kann, unbegrenzt ist.
- Die höchste Punktzahl gewinnt.
Bitte beachten Sie: Es gibt eine Herausforderung namens Quit Whining. Starten Sie Quining , bei dem auch Quines iteriert werden. Abgesehen davon, dass sie auf demselben Konzept basieren, handelt es sich jedoch um völlig unterschiedliche Arten von Herausforderungen. Der andere ist Straight-Up-Code-Golf, während dieser (absichtlich!) Wirklich ein geschäftiges Biberproblem in der Verkleidung ist. Die Techniken, die erforderlich sind, um eine gute Antwort auf diese Frage zu erhalten, unterscheiden sich wahrscheinlich stark von denen, die zur Beantwortung der anderen Frage erforderlich sind, und dies ist sehr beabsichtigt.
quelle
Antworten:
PHP, Zeitraum 2.100.000.000
Wer hätte gedacht, dass dies in PHP möglich ist?! :-)
Dies ist tatsächlich meine erste Quine und sie ist 99 Bytes lang:
Obwohl PHP größere Zahlen unterstützt als
2 * 10^8
durch Umschalten voninteger
aufdouble
, funktioniert das Inkrement nicht mehr (führt zu einer Endlosschleife) und ich habe keine andere Lösung gefunden, die in die 100 Bytes passt. Noch.Der Beweis ist ziemlich einfach, da er nur bei jeder Iteration hochzählt, bis der Rücksetzpunkt bei 2,1 Milliarden erreicht ist.
Dank an Dave , der den Ansatz in Pseudo-Code in den Kommentaren gepostet hat , und an Bob Twells , von dem ich den Code für ein minimales PHP-Quine kopiert habe.
Testprogramm (sloooooow):
Zumindest bin ich der erste, der antwortet.
quelle
Mathematica, Zeitraum
E8.5678 # 3E2.1923 # 4~ E6.2695 # 3 # 2Beachten Sie, dass die Ergebnisse in Hyper-E-Notation beschrieben sind . Die Iterationen ersetzen das Finale
Nest[#!,9,9^9^99!]
durch die Dezimalerweiterungen vonNest[#!,9,9^9^99!]
- 1,Nest[#!,9,9^9^99!]
- 2,Nest[#!,9,9^9^99!]
- 3, ..., 3, 2, 1 und zurück zuNest[#!,9,9^9^99!]
.quelle
ToString[#0, InputForm]
{"_~"}_~
, also denke ich, dass sie gültig sein sollte ...R, zufällige Periode mit Erwartung 2 ^ 19936-0.5
Der Standard-Zufallszahlengenerator von R hat eine Periode von 2 ^ 19937-1 und eine Gleichverteilung in 623 aufeinanderfolgenden Dimensionen. Somit wird irgendwo (aber nur einmal) in seiner Periode ein 623 langer Vektor von Nullen sein. Wenn wir dort ankommen (und mit dem Beginn der Sequenz ausgerichtet sind), ist die Summe der nächsten 623 zufälligen U [0,1] -Zahlen Null und wir kehren zu unserem ursprünglichen Programm zurück.
Beachten Sie, dass das Programm mit sehr hoher Wahrscheinlichkeit mehrmals denselben Zustand ungleich Null durchläuft, bevor es auf Null zurückkehrt. Zum Beispiel ist die Summe 311,5 am wahrscheinlichsten, und es gibt sehr viele Möglichkeiten, die passieren können, aber das RNG erlaubt, dass die Periode für 0 länger ist als die Periode für 311,5.
quelle
JavaScript, Zeitraum 9.007.199.254.700.000
Ich werde nicht gewinnen, aber es hat Spaß gemacht, mit JavaScript an dieser Herausforderung zu arbeiten:
Folgt dem folgenden Zyklus:
Hinweis: Sie können es um 18 Byte verkürzen, während Sie nur ~ 0,08% der Punktzahl entfernen, wie folgt:
quelle
C, Zeitraum 2.100.000.000
Basierend auf der PHP-Antwort (offensichtlich). Wird mit Erklärung aktualisiert, wenn ich Zeit habe.
quelle
C (gcc) , 66 Bytes, Periode 2 ^ 64
Probieren Sie es online aus!
2 ^ 64 Zahlen sind in einer
unsigned long
ganzen Zahl verfügbar . Daher ein Zeitraum von 2 ^ 64.quelle
Python 2
Probieren Sie es online aus!
Im Code
b=0
ändert sich das zub=1
dannb=2
und so weiter, bis es erreicht undb=decimal expansion of the period
dann wieder zurückgesetzt wirdb=0
quelle
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9
ist viel höher als9**9**99**99**99**99**99**99**99**99**99**99**99**99
. Das heißt, Sie könnten so etwaseval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))
für viel viel höhere Zahlen tun .Gol> <> , 70 Bytes, Zeit 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250
Andere weise als wirklich groß bekannt (3.25E270)
Dies ist eigentlich eine geänderte Version der Antwort, die ich auf den 500-Byte-Iterator gegeben habe
Hoffentlich habe ich die Punktzahl richtig verstanden und es gibt keine Fehler. Es gibt keine wirkliche Möglichkeit, diesen Wert tatsächlich zu berechnen, es ist theoretisch. Aber Mann, das ist eine riesige Zahl !!!
Probieren Sie es online aus!
quelle