Einführung
Wir alle kennen und lieben unsere Fibonacci-Sequenz und haben hier bereits eine Vielzahl von Herausforderungen erlebt. Es fehlt uns jedoch immer noch ein sehr einfacher Fall, den diese Antwort liefern wird: Umgekehrte Fibonacci! Daher ist es F_n
Ihre Aufgabe, etwas zu finden n
.
Spezifikation
Eingang
Ihre Eingabe ist eine nicht negative Ganzzahl, die garantiert Teil der Fibonacci-Sequenz ist.
Ausgabe
Die Ausgabe muss ebenfalls eine nicht negative Ganzzahl sein.
Was ist zu tun?
In der Einleitung heißt es bereits: Geben Sie bei gegebener Fibonacci-Zahl den Index aus. Die Fiboancci-Nummer ist hiermit definiert als F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
und Sie sind angegeben F(n)
und müssen zurückkehren n
.
Mögliche Eckfälle
0 ist ein gültiger Ein- und Ausgang.
Wenn Sie als Eingabe "1" angeben, können Sie wahlweise "1" oder "2" ausgeben.
Sie können immer davon ausgehen, dass Ihre Eingabe tatsächlich eine Fibonacci-Zahl ist.
Sie können davon ausgehen, dass die Eingabe als 32-Bit-Ganzzahl mit Vorzeichen dargestellt werden kann.
Wer gewinnt?
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes!
Es gelten selbstverständlich Standardregeln.
Testfälle
0 -> 0
2 -> 3
3 -> 4
5 -> 5
8 -> 6
13 -> 7
1836311903 -> 46
Antworten:
Eigentlich 1 Byte
Ja, dafür gibt es seit dem 16. November 2015 eine integrierte Version .
Probieren Sie es online aus
Zum Spaß sind es ohne das eingebaute 9 Bytes:
Probieren Sie es online!
Erläuterung:
quelle
Mathematica, 25 Bytes
Funktion. Ziemlich selbsterklärend, wenn du mich fragst.
quelle
Python,
363432 BytesVorherige Versionen:
Erläuterung
Die Kernidee ist, die Formel umzukehren
das sagt uns das
bekommen
Die Golf-Optimierungen sind:
len(str(n))
zum Berechnen Logbase 10 ohne Importlog
(alte Version verwendet.bit_length()
zu berechnen Logbase 2)n
zu einer Potenz, so dass die Annäherung des Logarithmus zwischen aufeinanderfolgenden Fibonacci-Zahlen unterscheiden kannDann wurde der Divisor mit der größtmöglichen Genauigkeit abgeschnitten und der Multiplikator ausgewählt, um die korrekten Ergebnisse für alle 32-Bit-Fibonacci-Zahlen zu erhalten.
quelle
f=
nicht gezählt wird.lambda n:~-len(`66*n**6`)//1.24
sollte das funktionieren.05AB1E , 3 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Jelly,
1411 BytesProbieren Sie es online!
Dies ist meine allererste Gelee-Antwort! Dies verwendet den Algorithmus aus der MATL-Antwort . Danke an Dennis für die 3 Bytes!
Erläuterung:
Dies erhält die richtige Antwort, jetzt müssen wir nur noch den Sonderfall '0' behandeln. Mit '0' als Argument bekommen wir
-infinity
, also kehren wir zurückquelle
Julia,
272618 BytesDabei wird die Umkehrung der Binet-Formel verwendet , und zwar mit einer Genauigkeit, die für 32-Bit-Ganzzahlen ausreicht. es funktioniert tatsächlich bis zu F (153) = 42.230.279.526.998.466.217.810.220.532.898> 2 105 .
Probieren Sie es online!
Wie es funktioniert
Die Binet-Formel besagt Folgendes.
Beschränken F auf den Satz von Fibonacci, der Karte n → F n einen hat rechte inverse F → n F .
Wir haben das
und alles, was zu tun bleibt, ist mit dem Kantenfall 0 umzugehen .
Da die Eingabe auf 32-Bit-Ganzzahlen beschränkt ist, können anstelle der Konstanten in der Formel kurze Dezimalstellen verwendet werden.
log φ = 0,481211825059603447… ≈ 0,48
Leider ist 0,5 nicht genau genug.
√5 = 2,2360679774997896964… ≈ 3
Das mag auf den ersten Blick wie eine schreckliche Annäherung erscheinen, aber wir nehmen Logarithmen und da log 3 - log √5 = 0,29389333245105… , wird das Ergebnis vor der Rundung durch einen kleinen konstanten Faktor abgerundet.
0,5 ≈ 0,7
Aufgrund des Überschusses aus der vorherigen Näherung können wir diesen Term sogar ganz weglassen und trotzdem korrekte Ergebnisse für F> 0 erhalten . Wenn jedoch F = 0 ist , ist der Logarithmus undefiniert. Es stellte sich heraus, dass 0,7 der kürzeste Wert ist, der unsere Formel auf F = 0 erweitert .
quelle
JavaScript,
5450695042 BytesSicherlich wird es nicht gewinnen, nur zum Spaß :)
Ok, das Prüfen auf Null verbraucht 19 Bytes. WTF?Ich Idiot.Demo! Um den letzten Testfall zu sehen, müssen Sie ein wenig durch die Konsole scrollen.
Vielen Dank an @edc für die Kürzung um 8 Bytes.
quelle
b=>{for(j=1,i=c=0;b-i;c++)i=j+(j=i);return c}
45, Golfb=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c
42.Perl 6
33 3027 BytesVersuch es
Erläuterung:
Prüfung:
quelle
first *==$_
mit nur ersetzenfirst $_
, da eine Zahl ein gültiger Smart-Matcher ist....
Operator anstelle vonfirst
Gelee , 8 Bytes
Probieren Sie es online! Beachten Sie, dass dieser Ansatz für den letzten Testfall zu ineffizient ist.
Wie es funktioniert
quelle
Pyke, 5 Bytes
Probieren Sie es hier aus!
quelle
Python, 29 Bytes
Dividiert die Eingabe rekursiv durch die Golden-Ratio-Approximation 1,61, bis sie unter 0,7 liegt, und gibt die Anzahl der Divisionen aus.
Für 0 wird der Code ausgegeben
False
, der in Python 0 entspricht . Dies kann für 2 Bytes vermieden werdenquelle
JavaScript (ES6),
3933 BytesSelbst mit ES7 benötigt die inverse Binet-Formel 47 Bytes:
quelle
log
und berechnen Sie alle Konstanten vor ...f(n,k,j+k)
, sollten Sie die Zuweisung einschließenf=
und als +2 Bytes zählen . Die Regel für unbenannte Lambdas sollte hier nicht gelten.Salbei, 49 Bytes
Dank TuukkaX für den Vorschlag über das Speichern
sqrt(5)
alss
ein paar Bytes rasieren.Probieren Sie es online aus .
Dieser Ansatz, der eine Umkehrung der Binet-Formel verwendet, bietet einige Verbesserungen gegenüber dem vorherigen Ansatz: Er ist schneller (konstante Zeit im Vergleich zur quadratischen Zeit), funktioniert tatsächlich für größere Eingaben und ist kürzer!
Python-Benutzer fragen sich vielleicht, warum ich
sqrt(5)
statt der kürzeren eine verwende5**.5
- das liegt daran, dass diese5**.5
mit der C-pow
Funktion berechnet wird und aufgrund von Gleitkommaproblemen an Genauigkeit verliert. Viele mathematische Funktionen (einschließlichsqrt
undlog
) sind in Sage überladen, um einen genauen symbolischen Wert zurückzugeben, der nicht an Genauigkeit verliert.quelle
sqrt(5)
Variable in einer Position halten und sie zweimal verwenden, anstatt sie zweimal einzugebensqrt(5)
?MATL , 14 Bytes
Probieren Sie es online!
Dies verwendet eine Umkehrung der Binet-Formel und ist daher sehr schnell.
Sei F die n- te Fibonacci-Zahl und φ der goldene Schnitt . Dann
Der Code verwendet diese Formel mit zwei Änderungen:
Wie es gemacht wird
quelle
O1G:"yy+]vGmfq
t?17L&YlXkQ
5X^*
. ( Ich habe das schon einmal gemacht .) Und ich kenne MATL nicht genug, um es möglicherweise weiter zu verbessern.Python, 38 Bytes
Teste es auf Ideone .
quelle
JavaScript, 22 Byte
quelle
-Infinity|0
ist es0
in JavaScript. Stelle dir das vor.-Infinity = FFF00000 00000000
. Ich war froh herauszufinden, dass es 3 Bytes spart, weil ich keinen expliziten Zero-Test voranstellen mussn&&
. Abgesehen davon ist der Hauptzweck von|0
ein Ersatz fürMath.trunc()
(wie÷
in Julia).C,
6258 BytesDetailliert
quelle
Java 7, 70 Bytes
https://ideone.com/I4rUC5
quelle
int c(int n){int a=0,b=1,c=0,t;for(;a<n;t=b,b+=a,a=t)c++;return c;}
(nicht getestet)int c(int n){int a=0,b=1,c=0;while(a<n){c++;b+=a;a=b-a;}return c;}
(nicht getestet)int c(int n){int a=0,b=1,c=0;for(;a<n;b+=a,a=b-a)c++;return c;}
(nicht getestet)TSQL, 143 Bytes
Die Eingabe erfolgt
@n
wie inDECLARE @n INT = 1836311903;
quelle
Haskell, 45 Bytes
quelle
Sesos , 28 Bytes
Hexdump:
Probieren Sie es online!
(Exponentialzeit, da in Sesos das Kopieren einer Zahl Exponentialzeit benötigt.)
Assembly zum Generieren der Binärdatei:
quelle
Java 8 61 Bytes
Entspricht der @ dainichi-Antwort, die nur mithilfe von Java 8-Lambdas verkürzt wurde. Die Antwort ist ein gültiger Wertausdruck.
Ungolfed:
quelle
Pyth, 13 Bytes
Testsuite.
Annäherung in Python 2:
alternativer Ansatz, 18 Bytes
Testsuite.
Dies wird
.I
für Inverse verwendet.quelle
Java 7, 89 Bytes
Inspiriert von der Erklärung der 05AB1E -Antwort von @Adnan .
Ungolfed & Testfälle:
Probieren Sie es hier aus. (Das Zeitlimit für den letzten Testfall wurde überschritten, auf meinem PC dauert es jedoch 30-45 Sekunden.)
Ausgabe:
quelle
Perl 5.10, 48 Bytes
Grundsätzlich suche ich das richtige
n
damitF(n) = input
.-a
Schalter fügt ein Byte hinzu.Probieren Sie es hier aus!
quelle
J
322717 BytesBerechnet die ersten n Fibonacci-Zahlen und findet dann den Index von n in dieser Liste.
Verwendungszweck
Zusätzliche Befehle werden zum Formatieren mehrerer Ein- / Ausgaben verwendet. Der letzte Testfall entfällt, da die Berechnung viel mehr Zeit in Anspruch nimmt.
Erläuterung
quelle
Mathematica, 30 Bytes
Reine Funktion; Gibt 2 zurück, wenn die Eingabe 1 ist.
Schlägt den anderen Mathematica-Eintrag nicht, zeigt aber eine ungewöhnliche Methode: Es ist eine (sehr coole) Tatsache, dass die N-te Fibonacci-Zahl die nächste Ganzzahl zu [1 / sqrt (5) mal der N-ten Potenz des goldenen Schnitts] ist (" Binets Formel ").
Daher ist die Umkehrfunktion der Logarithmus der Basis [goldenes Verhältnis] von [sqrt (5) mal der fraglichen Fibonacci-Zahl]. Das
.8+
ist ein Hack , um sicherzustellen , dass wir nicht nehmen den Logarithmus von 0, ohne dass die anderen Werte vermasseln.quelle
Japt , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
Brachylog , 14 Bytes
Probieren Sie es online!
Übernimmt die Eingabe über die Ausgabevariable und gibt sie über die Eingabevariable aus.
Ich bin mir nicht ganz sicher, warum
≜
das notwendig ist.quelle
Javascript (mit externer Bibliothek) (84 Bytes)
Link zu lib: https://github.com/mvegh1/Enumerable
Codeerklärung: Die Bibliothek verfügt über eine statische Methode, die eine Sequenz erstellt, bis das Prädikat einen undefinierten Rückgabewert hat. Das Prädikat hat eine Signatur von ("i" ndex, aktuelles internes "a" -Ray generiert). Bei jeder Iteration prüfen wir, ob das letzte Element des internen Arrays gleich der Eingabe n ist. Wenn nicht, geben Sie den nächsten Wert in der Fib-Sequenz zurück. Andernfalls hat das Prädikat ein undefiniertes Ergebnis, das die Generierung der Sequenz beendet. Dann geben wir die Länge der Sequenz zurück (und subtrahieren 1, um der 0-Basis zu entsprechen, wie sie im OP zu sehen ist
quelle
n=>{a=c=t=0,b=1;while(a<n){c++;t=b;b+=a;a=t}return c}
Probieren Sie es online!