Implementiere das Fibonacci-Quine

13

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!

Matthew Roh
quelle
Verwandte .
Undichte Nonne
4
Der quine Teil trägt nicht viel zu dieser Herausforderung bei. Dies ist nur "nächster Wert in der Fibonacci-Sequenz" plus universelle Quine-Konstruktoren, wie die Antworten zeigen.
Genau. Auch hier würde ich gerne eine kreative Lösung sehen. Aber wenn Sie eine kreative Lösung so schlecht wollen, warum dann nicht eine Code-Herausforderung anstelle von Code-Golf. Das Gewinnkriterium könnte die höchste Anzahl von Stimmen nach einem gewissen Zeitintervall sein oder so.
Festpunkt
@FixedPoint Was ist mit einem zweiten Kriterium? Jemand macht eine kreative Lösung, ich gebe ihnen Kopfgeld.
Matthew Roh
@FixedPoint Das ist ein Beliebtheitswettbewerb
Boboquack

Antworten:

8

Mathematica, 61 Bytes

ToString[#0 /. v:2 :> RuleCondition[Round[GoldenRatio v]]] & 

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]. Allerdings nextFibwü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 einen WithBlock, der die Auswertung erzwingt, aber die zweite Antwort von WReach enthält eine kürzere Alternative unter Verwendung des undokumentierten eingebauten Bausteins, RuleConditionder 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 Mathematics GoldenRationein symbolischer Wert ist und daher Roundimmer ein genaues Ergebnis berechnen kann.

In Summe:

... #0 ... &

Eine unbenannte Funktion, wobei #0auf das Funktionsobjekt selbst verwiesen wird.

... /. v:2 :> ...

Suchen Sie 2im Ausdrucksbaum der Funktion einen (dieser entspricht 2natürlich nur sich selbst), rufen Sie ihn auf vund ersetzen Sie ihn durch ...

... RuleCondition[Round[GoldenRatio v]]

... die nächste Fibonacci-Nummer.

ToString[...]

Konvertieren Sie den resultierenden Ausdrucksbaum in seine Zeichenfolgendarstellung.

Martin Ender
quelle
Es ist schön zu wissen, dass man manchmal hart daran arbeiten muss :)
Greg Martin
Gibt es kein Symbol für den goldenen Schnitt?
Caird Coinheringaahing
@cairdcoinheringaahing nein.
Martin Ender
7

CJam , 26 Bytes

2{0X{_@+_W$>!}go;\;"_~"}_~

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.

Martin Ender
quelle
6
So früh?
Matthew Roh
6

CJam , 20 Bytes

2{\5mq)*)Y/io"_~"}_~

Probieren Sie es online!

jimmy23013
quelle
Wow, 20 Bytes: Ich bin sprachlos ...
Mr. Xcoder
5

Python 3 , 81 79 Bytes

s='s=%r;print(s%%(s,round(%s*(1+5**.5)/2)))';print(s%(s,round(2*(1+5**.5)/2)))

Probieren Sie es online!
Verwendet den goldenen Schnitt, um die nächste Zahl zu berechnen

Stange
quelle
4

Gelee , 14 Bytes

“×Øp+.ḞṭØv”Ṙv2

Probieren Sie es online! oder überprüfen Sie alle erforderlichen Iterationen .

Wie es funktioniert

“×Øp+.ḞṭØv”Ṙv2  Main link. No arguments.

“×Øp+.ḞṭØv”     Set the left argument and return value to the string "×Øp+.ḞṭØv".
           Ṙ    Print a string representation of the return value and yield the
                unaltered return value.
            v2  Evaluate the return value as a Jelly program with left argument 2.
 ×Øp                Multiply the left argument by the golden ratio.
    +.              Add 0.5 to the resulting product.
      Ḟ             Floor; round the resulting sum down to the nearest integer.
        Øv          Yield the string "Øv".
       ṭ            Tack; append the result to the left to the result to the right.
Dennis
quelle
1

Schnell, 251 Bytes

Ein bisschen ausführlich für mich, aber ich kann nicht herausfinden, wie ich es kürzer machen kann:

import Foundation;var n="\"";var u="\\";var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Ungolfed:

import Foundation
var n="\""
var u="\\"
var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))"
print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Mein Problem ist es, die Anführungszeichen für die neue Version von zu bekommen s.

Caleb Kleveter
quelle
1

Cheddar , 136 Bytes

let b=1;for(let a=1;a<2;a=b-a){b+=a};let s='let b=1;for(let a=1;a<%i;a=b-a){b+=a};let s=%s;print s%b%@"39+s+@"39';print s%b%@"39+s+@"39

Probieren Sie es online!

Undichte Nonne
quelle
1

Javascript (ES6), 151 - 60 Byte

Neue Version, Dank an @ Leaky Nun

x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)

Alte Version :

x=i=>{var s=Math.sqrt(5),a=1;f=n=>{return Math.ceil((((1+s)/2)**n-((1-s)/2)**n)/s)};while(f(++a)<=i);console.log('x='+String(x)+';x('+f(a)+')');};x(2)

Basierend auf dieser .

rbntd
quelle
1
Willkommen bei PPCG! Wir hoffen, dass Sie hier eine tolle Zeit haben werden.
Undichte Nonne
@LeakyNun Jetzt hoffentlich behoben!
8.
Golf-Version:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Undichte Nonne
@LeakyNun Wow, das ist kurz! Aber ist es nicht zu ungefähr? es gibt 50159 für i = 31000 aus, obwohl die richtige Antwort 46368
rbntd
Ich verstehe nicht 31000ist keine Fibonacci-Zahl.
Undichte Nonne
1

Gleichstrom , 35 Bytes

2[r9k5v1+2/*.5+0k1/n91PP93P[dx]P]dx

Eine Version mit Iteration (56 Bytes):

2[rsP1dsN[lN+lNrsNdlP[s.q]s.=.lFx]dsFxlNn91PP93P[dx]P]dx
eush77
quelle
1

Schnell, 235 Bytes

Dies ist eine verbesserte Version von Caleb ‚s Antwort .

import Foundation;var n="\"",u="\\",s="import Foundation;var n=%@%@%@%@,u=%@%@%@%@,s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))
Nathan Piercy
quelle
0

Java (OpenJDK 8) , 239 Byte

interface a{static void main(String[]p){int a=1,b=1;for(;a<2;a=b-a)b+=a;String s="interface a{static void main(String[]p){int a=1,b=1;for(;a<%d;a=b-a)b+=a;String s=%c%s%c;System.out.printf(s,b,34,s,34);}}";System.out.printf(s,b,34,s,34);}}

Probieren Sie es online!

Undichte Nonne
quelle