Ein Quine ist ein Programm, das beim Ausführen seine Quelle ausgibt.
In dieser Herausforderung solltest du ein Fibonacci-Quine machen, eine Variante des Quine.
Was ist eine Fibonacci-Quine?
Ein Fibonacci-Quine ist ein Programm, das eine Modifikation der Quelle nach folgender Regel ausgibt:
Die ursprüngliche Quelle sollte sein ...2...
. Mit anderen Worten sollte die Quelle enthalten 2
. (Warum 2? Wenn es 1 war, würde niemand wissen, ob es die erste 1 oder die zweite war, sogar das Programm selbst)
Beim Ausführen sollten Sie die Quelle ausgeben, aber nur die spezifische Nummer (in diesem Stadium 2
) wird auf die nächste Nummer der Fibonacci-Sequenz geändert. Zum Beispiel ...3...
. Gleiches gilt für die Ausgabe und die Ausgabe der Ausgabe usw. Sie können ganze Zahlen für bis zu 2 ^ 32-1 unterstützen. Bei Ganzzahlen über diesem Grenzwert können Sie die nächste Ausgabe wählen.
Hinweis des OP
Ich würde wirklich gerne eine kreative Lösung dafür sehen. Ich konnte mir keine einzige Lösung dafür vorstellen, da beide wichtigen Aspekte der Herausforderung, Fibonacci und Quine, nicht einfach sind. Ich werde dann warten!
Antworten:
Mathematica, 61 Bytes
Beachten Sie, dass ein Leerzeichen vorhanden ist. Dies ist eine Funktion quine, dh der obige Code wird zu einer unbenannten Funktion ausgewertet, die, wenn sie aufgerufen wird, den Code selbst als Zeichenfolge zurückgibt (mit
2
Änderung auf die nächste Fibonacci-Nummer).Es war überraschend schwierig, zur Arbeit zu kommen. Die Grundidee ist, die Funktion selbst (mit
#0
) zu nehmen und eine Zahl in dieser Funktion durch die nächste mit zu ersetzen/. v:2 :> nextFib[v]
. AllerdingsnextFib
würde in diesem Stadium nicht ausgewertet bekommen , so dass wir nicht wirklich mit der neuen Nummer im Quellcode enden würden. Nachdem ich eine Weile gesucht hatte, um herauszufinden, wie eine sofortige Auswertung erzwungen werden kann, fand ich diesen großartigen Beitrag auf Mathematica.SE . Die "Standard" -Technik verwendet einenWith
Block, der die Auswertung erzwingt, aber die zweite Antwort von WReach enthält eine kürzere Alternative unter Verwendung des undokumentierten eingebauten Bausteins,RuleCondition
der auch die Auswertung erzwingt.Bei der Berechnung der nächsten Fibonacci-Zahl wird die Tatsache ausgenutzt , dass das Verhältnis der aufeinanderfolgenden Zahlen ungefähr dem goldenen Verhältnis 1,618 entspricht. Dies ist bis zur Rundung genau. Wir müssen uns also nicht die letzten beiden Zahlen merken und können es einfach tun
Round[GoldenRatio v]
. Dies wird niemals an Genauigkeit verlieren, da MathematicsGoldenRation
ein symbolischer Wert ist und daherRound
immer ein genaues Ergebnis berechnen kann.In Summe:
Eine unbenannte Funktion, wobei
#0
auf das Funktionsobjekt selbst verwiesen wird.Suchen Sie
2
im Ausdrucksbaum der Funktion einen (dieser entspricht2
natürlich nur sich selbst), rufen Sie ihn aufv
und ersetzen Sie ihn durch ...... die nächste Fibonacci-Nummer.
Konvertieren Sie den resultierenden Ausdrucksbaum in seine Zeichenfolgendarstellung.
quelle
CJam , 26 Bytes
Probieren Sie es online!
Wahrscheinlich nicht ganz optimal. Wir iterieren einfach die Fibonacci-Sequenz, bis der Wert größer als der letzte ist, und verwenden das Ergebnis als neuen Wert am Anfang des Programms.
quelle
Python 3 , 95 Bytes
Probieren Sie es online!
Offensichtlich eine Abzweigung von Martin Enders CJam-Antwort .
quelle
CJam , 20 Bytes
Probieren Sie es online!
quelle
Eigentlich 19 Bytes
Probieren Sie es online!
Offensichtlich eine Abzweigung von Martin Enders CJam-Antwort .
quelle
Python 3 ,
8179 BytesProbieren Sie es online!
Verwendet den goldenen Schnitt, um die nächste Zahl zu berechnen
quelle
Gelee , 14 Bytes
Probieren Sie es online! oder überprüfen Sie alle erforderlichen Iterationen .
Wie es funktioniert
quelle
Schnell, 251 Bytes
Ein bisschen ausführlich für mich, aber ich kann nicht herausfinden, wie ich es kürzer machen kann:
Ungolfed:
Mein Problem ist es, die Anführungszeichen für die neue Version von zu bekommen
s
.quelle
Cheddar , 136 Bytes
Probieren Sie es online!
quelle
Javascript (ES6),
151 -60 ByteNeue Version, Dank an @ Leaky Nun
Alte Version :
Basierend auf dieser .
quelle
x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
31000
ist keine Fibonacci-Zahl.Gleichstrom , 35 Bytes
Eine Version mit Iteration (56 Bytes):
quelle
Schnell, 235 Bytes
Dies ist eine verbesserte Version von Caleb ‚s Antwort .
quelle
Java (OpenJDK 8) , 239 Byte
Probieren Sie es online!
quelle