Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, um zu überprüfen, ob eine eingegebene Zahl eine Fibonacci-Zahl ist . Eine Fibonacci-Zahl ist eine Zahl, die in der Fibonacci-Folge enthalten ist.
Die Fibonacci-Sequenz ist definiert als:
F(n) = F(n - 1) + F(n - 2)
Mit den Samen wird F(0) = 0
und F(1) = 1
.
Eingang:
Eine nicht negative ganze Zahl zwischen 0 und 1.000.000.000, die eine Fibonacci-Zahl sein kann oder nicht.
Ausgabe:
Ein wahrer / falscher Wert, der angibt, ob die Eingabe eine Fibonacci-Zahl ist oder nicht.
Beispiele:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Wertung:
Dies ist Code-Golf , die niedrigste Byte-Anzahl gewinnt.
code-golf
sequence
decision-problem
fibonacci
Gryphon - Setzen Sie Monica wieder ein
quelle
quelle
Antworten:
Neim , 2 Bytes
Erläuterung:
Funktioniert genauso wie meine Antwort auf " Es ist hip, quadratisch zu sein" , verwendet jedoch eine andere unendliche Liste
f
:, für Fibonacci.Versuch es!
quelle
66 D5
JavaScript (ES6), 34 Byte
Generiert rekursiv die Fibonacci-Sequenz, bis ein Element gefunden wird, das größer oder gleich der Eingabe ist, und gibt dann die Eingabe item == zurück.
quelle
Netzhaut , 23 Bytes
Probieren Sie es online!
Eingabe in unary, Outputs
0
oder1
.Erläuterung
Die Fibonacci-Sequenz ist ein guter Kandidat für eine Lösung mit Vorwärtsreferenzen, dh einer "Rückreferenz", die sich entweder auf eine umgebende Gruppe oder auf eine Gruppe bezieht, die später im regulären Ausdruck erscheint (in diesem Fall verwenden wir tatsächlich beide). Wenn wir Zahlen wie diese abgleichen, müssen wir einen rekursiven Ausdruck für den Unterschied zwischen Sequenzelementen finden. Um beispielsweise Dreieckszahlen abzugleichen, stimmen wir normalerweise mit dem vorherigen Segment plus eins überein. Um quadratische Zahlen abzugleichen (deren Unterschiede ungerade sind), stimmen wir mit dem vorherigen Segment plus zwei überein.
Da wir die Fibonacci-Zahlen erhalten, indem wir das vorletzte Element zum letzten addieren, sind die Unterschiede zwischen ihnen auch nur die Fibonacci-Zahlen. Wir müssen also jedes Segment als die Summe der beiden vorherigen Segmente abgleichen. Der Kern des Regex ist:
Nun werden die Fibonacci-Zahlen beginnend mit 1 , dh 1, 1, 2, 3, 5, ... addiert . Diejenigen Add bis zu 1, 2, 4, 7, 12, ... . Dh sie sind eins weniger als die Fibonacci-Zahlen, also fügen wir
1
am Ende ein hinzu. Der einzige Fall, den dies nicht abdeckt, ist Null, daher haben wir^$
zu Beginn die Alternative, dies abzudecken.quelle
^$|^(^1|\2?+(\1))*1$
^
.Regex (ECMAScript-Variante),
392358328224206165 BytesDie Techniken, die erforderlich sind, um Fibonacci-Zahlen mit einem ECMAScript-Regex (in Unary) abzugleichen, sind weit davon entfernt, wie es in den meisten anderen Regex-Varianten am besten funktioniert. Das Fehlen von vorwärts / verschachtelten Rückverweisen oder Rekursionen bedeutet, dass es unmöglich ist, eine laufende Summe von irgendetwas direkt zu zählen oder zu behalten. Das Fehlen von Lookbehind macht es oft zu einer Herausforderung, auch genügend Platz zum Arbeiten zu haben.
Viele Probleme müssen aus einer ganz anderen Perspektive angegangen werden und scheinen unlösbar, bis einige wichtige Erkenntnisse vorliegen. Es zwingt Sie, ein viel breiteres Netz zu ziehen, um herauszufinden, welche mathematischen Eigenschaften der Zahlen, mit denen Sie arbeiten, verwendet werden können, um ein bestimmtes Problem lösbar zu machen.
Im März 2014 passierte dies für Fibonacci-Zahlen. Auf der Wikipedia-Seite konnte ich anfangs keinen Weg finden, obwohl eine bestimmte Eigenschaft verblüffend nahe lag. Dann skizzierte der Mathematiker Teukon eine Methode, die klar machte, dass es möglich wäre, diese Eigenschaft zusammen mit einer anderen zu verwenden. Er zögerte, den Regex tatsächlich zu konstruieren. Seine Reaktion, als ich weitermachte und es tat:
Wie bei meinen anderen unären ECMAScript-Postings für mathematische Regex werde ich eine Warnung geben: Ich empfehle dringend, zu lernen, wie man unäre mathematische Probleme in ECMAScript-Regex löst. Es war eine faszinierende Reise für mich, und ich möchte sie keinem verderben, der sie möglicherweise selbst ausprobieren möchte, insbesondere nicht jenen, die sich für Zahlentheorie interessieren. In diesem Beitrag finden Sie eine Liste der nacheinander mit Spoiler-Tags gekennzeichneten empfohlenen Probleme, die Sie nacheinander lösen können.
So liest keine weiteren , wenn Sie nicht einig einstellige regex Magie für Sie verwöhnen wollen . Wenn Sie versuchen möchten, diese Magie selbst herauszufinden, empfehle ich dringend, zunächst einige Probleme in ECMAScript regex zu lösen, wie in dem oben verlinkten Beitrag beschrieben.
Die Herausforderung, vor der ich anfangs stand: Eine positive ganze Zahl x ist genau dann eine Fibonacci-Zahl, wenn 5x 2 + 4 und / oder 5x 2 - 4 ein perfektes Quadrat sind. Aber es gibt keinen Raum, um dies in einer Regex zu berechnen. Der einzige Raum, in dem wir arbeiten müssen, ist die Nummer selbst. Wir haben nicht einmal genug Platz, um mit 5 zu multiplizieren oder das Quadrat zu nehmen, geschweige denn mit beiden.
Teukon's Idee, wie man es löst ( ursprünglich hier gepostet ):
Und hier ist ein Modell des Algorithmus in C, das ich als Test geschrieben habe, bevor ich ihn in Regex implementiert habe.
Also ohne weiteres, hier ist der reguläre Ausdruck:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Probieren Sie es online!
Und die schön gedruckte, kommentierte Fassung:
Der Multiplikationsalgorithmus wird in diesen Kommentaren nicht erläutert, sondern in einem Abschnitt meines Postens mit vielen regulären Zahlen kurz erläutert .
Ich habe sechs verschiedene Versionen des Fibonacci-Regex beibehalten: vier, die von der kürzesten Länge zur schnellsten Geschwindigkeit ratschen und den oben erläuterten Algorithmus verwenden, und zwei andere, die einen anderen, viel schnelleren, aber viel längeren Algorithmus verwenden, den ich tatsächlich zurückgeben kann Der Fibonacci-Index als Übereinstimmung (die Erklärung dieses Algorithmus hier würde den Rahmen dieses Beitrags sprengen, wird jedoch in der ursprünglichen Diskussion Gist erläutert ). Ich glaube nicht, dass ich so viele sehr ähnliche Versionen eines regulären Ausdrucks wieder beibehalten würde, weil ich zu der Zeit alle meine Tests in PCRE und Perl durchgeführt habe, aber meine reguläre Ausdrucksmaschine ist schnell genug, dass Geschwindigkeitsbedenken nicht mehr so wichtig sind (und wenn ein bestimmtes Konstrukt einen Engpass verursacht, kann ich eine Optimierung hinzufügen) - obwohl ich wahrscheinlich wieder eine schnellste und eine kürzeste Version beibehalten würde, wenn der Unterschied wäre in der Geschwindigkeit waren groß genug.
Die Version "Gib den Fibonacci-Index minus 1 als Match zurück" (nicht stark golfen):
Probieren Sie es online!
Alle Versionen sind auf Github mit der vollständigen Commit-Historie der Golfoptimierungen:
regex zum Abgleichen Fibonacci - Zahlen - kurze, Geschwindigkeit 0.txt (kürzesten aber langsamste, wie in dieser Veröffentlichung)
regex zum Abgleichen Fibonacci - Zahlen - kurzen, Geschwindigkeit 1.txt
regex zum Abgleichen Fibonacci - Zahlen - kurze, Geschwindigkeit 2.txt
regex für passende Fibonacci-Zahlen - kurz, Geschwindigkeit 3.txt regulärer Ausdruck
für passende Fibonacci-Zahlen - schnellste.txt regulärer Ausdruck
für passende Fibonacci-Zahlen - Rückgabe index.txt
quelle
Python 3 , 48 Bytes
Probieren Sie es online!
quelle
int
würde der Balken höher gesetzt (immer noch nicht beliebig groß), aber wir erzwingen auch nicht, dass C-Antworten 64-Bit-Ganzzahlen (oder 128-Bit mit gcc) verwenden. Jedenfalls erscheint es unsinnig, denselben Algorithmus in einer Sprache, aber nicht in einer anderen zu verwenden.Python 2,
4844 BytesProbieren Sie es online aus
Vielen Dank an Jonathan Allan für das Speichern von 4 Bytes
quelle
False
und falsche Werte handeltTrue
: TIO!n-a
anstelle vonn==a
und -1 und 0 als Rückgabewerte verwenden.-101
oder ein anderes Ergebnis anstelle von haben-1
.05AB1E ,
87 BytesErläuterung:
Probieren Sie es online!
-1 Dank an Jonathan Allan für die Umgehung der 0-not-a-Fibonacci-Zahl.
quelle
n
(ein Byte zu sparen) zu generieren, wieÅF
es inklusiv ist, und dies¹å
würde in0
beiden Fällen dazu führenn=0
?Perl 6 , 23 Bytes
quelle
{(0,1,*+*...^*>$_).tail==$_}
war das, was ich anfangs posten wollte. Vielleicht bin ich irgendwann zu Set-Operatoren gekommen .Im Ernst , 3 Bytes
Probieren Sie es online!
Gibt den Index +1 in der Liste der Fibonacci-Zahlen zurück, wenn wahr, andernfalls wird falsch zurückgegeben.
Erläuterung:
quelle
Jelly ,
8 76 BytesProbieren Sie es online!
Wie?
Anmerkungen:
‘
wird, so dass diese Arbeiten benötigt für 2 und 3 , da sie das sind 3 rd und 4 th Fibonacci - Zahlen - über 3 alle Fibonacci - Zahlen sind größer als ihr Index.-
benötigt wird , um ( und nicht nur‘R
) so Dies funktioniert für 0 , da 0 die 0 - te Fibonacci - Zahl;quelle
3
:)ZX81 BASIC
180151100~ 94 tokenisierte BASIC-BytesDank Moggy in den SinclairZXWorld-Foren ist hier eine viel übersichtlichere Lösung, die mehr Bytes einspart.
Dies gibt 1 aus, wenn eine Fibonacci-Zahl eingegeben wird, oder Null, wenn nicht. Das spart zwar Bytes, ist aber viel langsamer als die alten Lösungen unten. Entfernen Sie aus
VAL
Gründen der Geschwindigkeit (aber für mehr BASIC-Bytes) die Wrapper um die String-Literalzahlen. Hier sind die alten (er) Lösungen mit einigen Erklärungen:Die obigen Änderungen ersparen weitere BASIC-Bytes, um die
IF
Anweisungen in einerPRINT
Zeile 12 zusammenzufassen. Weitere Bytes wurden mit demVAL
Schlüsselwort und mit gespeichertGOTO CODE "£"
, das im ZX81-Zeichensatz 12 lautet. Zeichenfolgen speichern mehr Bytes als Zahlen, da alle numerischen Werte als Gleitkommazahlen gespeichert werden. Nehmen Sie daher mehr Platz auf dem VAR-Stapel ein.quelle
5 IF R<F THEN NEXT I
- my bad ändere!C #, 109 Bytes
Könnte definitiv verbessert werden, aber ich hatte keine Zeit.
quelle
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(nur 80 Byte). Probieren Sie es online!a+=b
statta=a+b
undb+=a
stattb=a+b
.> <> ,
2119 + 3 =2422 BytesEs wird erwartet, dass die Eingabe beim Programmstart auf dem Stack ist, also +3 Bytes für das
-v
Flag.Probieren Sie es online!
Dies funktioniert, indem Fibonacci-Zahlen generiert werden, bis sie größer oder gleich der eingegebenen Zahl sind, und dann die zuletzt generierte Zahl auf Gleichheit mit der Eingabe überprüft wird. Gibt aus,
1
ob es eine Fibonacci-Zahl war,0
sonst aus, .Um sicherzustellen, dass
0
richtig gehandhabt wird, lautet der Startwert-1 1
- die erste generierte Zahl ist0
eher als1
.Vielen Dank an @cole für den Hinweis, dass mit STDIN auf den Stack geschoben werden
i
kann,-1
wenn dieser leer ist. Sehr schlau!Vorherige Version:
quelle
i
statt01-
.i
als-1
wenn es keine Eingabe zu STDIN gibt, ich hätte das nicht berücksichtigt. Schön gemacht!Mathematica, 37 Bytes
-4 Bytes von @ngenisis
quelle
Fibonacci[0]
gibt0
, so können Sie4
Bytes sparen, indem Sie0
in denTable
Bereich aufnehmen. Sie können ein weiteres Byte mit der Infixnotation speichern fürTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 Bytes)
Probieren Sie es online!
Nicht die golferischste Lösung, aber ich wollte direkt prüfen, ob "5 * x ^ 2 +/- 4" ein perfektes Quadrat ist .
Erläuterung:
Hinweis:
Im Fall "0" wird "2" zurückgegeben, da sowohl 4 als auch -4 perfekte Quadrate sind, die mit 1 identisch sind und "1 1" ergeben. Betrachten Sie jede Ausgabe ungleich Null als "wahr" und 0 als "falsch".
quelle
Pari / GP , 32 Bytes
Probieren Sie es online!
quelle
PHP , 44 Bytes
Probieren Sie es online!
PHP , 58 Bytes
Probieren Sie es online!
quelle
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 BytesTesten Sie es selbst!
Alternative (immer noch 49 Bytes)
Nicht sehr originell: Es ist die einfache und grundlegende iterative Version.
Dies funktioniert für Zahlen bis zu 1.836.311.903 (47. Fibonacci-Zahl) enthalten. Darüber hinaus ist das Ergebnis undefiniert (einschließlich einer potenziellen Endlosschleife).
Danke an Kevin Cruijssen und David Conrad für die Hilfe beim Golfen :)
quelle
n==0
ann<1
. In der Frage steht " Eine nicht negative ganze Zahl zwischen 0 und 1.000.000.000 ".b+=a;a=b-a;
C # (.NET Core) , 51 Byte
Probieren Sie es online!
-6 Bytes dank @Oliver!
Diese Lösung verwendet eine ziemlich einfache rekursive Funktion.
n
ist die zu testende Zahl.a
undb
sind die 2 neuesten Zahlen in der Sequenz.Die TIO-Verknüpfung zeigt, dass dies für 1134903170 funktioniert, was den für die Challenge erforderlichen Maximalwert überschreitet.
quelle
a<n
nach 51 BytesAlchemist ,
205134 BytesEin großes Dankeschön an ASCII-only für das recht clevere Zusammenführen von Zuständen, wodurch 71 Bytes gespart werden !!
Probieren Sie es online aus oder überprüfen Sie es im Batch!
Ungolfed
quelle
0
Überprüfungen für weniger Bytes auf Kosten des Nichtdeterminismus entfernenb
fehl , aber das Hinzufügen von -atom bei der Initialisierung behebt es (und speichert 2 Bytes): D DankeGelee , 5 Bytes
Probieren Sie es online!
Gibt 0 für Nicht-Fibonacci-Zahlen und die 1-indizierte Position der Zahl in der Fibonacci-Sequenz für Fibonacci-Zahlen zurück.
Erläuterung:
quelle
Dyalog APL, 17 Bytes
Probieren Sie es online!
quelle
R
4340 Bytespryr::f
erstellt eine Funktion:Dient
DescTools::Fibonacci
zum Erstellen der erstenx+1
Fibonacci-Zahlen und zum Überprüfen der Aufnahme.x+1
weil das dritte Fibnum 2 ist, und das würde nicht ausreichen, um die Einbeziehung von 3 zu überprüfen.Zum Glück
Desctools::Fibonacci(0)=0
ist das also eine schöne Werbegeschenk.-3 Bytes dank MickyT
quelle
-1:x+1
Sie sparen ein Byte, aber0:45
Sie sparen drei und decken den erforderlichen Bereich abpryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 Bytes
Probieren Sie es online!Dies nutzt die Tatsache aus, dass die Eingabe im Bereich von 0 bis 1.000.000.000 liegt. Daher müssen nur die ersten 45 Fibonacci-Zahlen überprüft werden.
f=0:scanl(+)1f
erzeugt eine unendliche Liste von Fibonacci-Zahlen,take 45f
ist die Liste der ersten 45 Fibonacci-Zahlen undelem
prüft, ob sich die Eingabe in dieser Liste befindet.Uneingeschränkte Version: 36 Bytes
Probieren Sie es online! Für jeden
n
, die die erstenn+3
Fibonacci-Zahlen nehmen, wird garantiert, dassn
diese in dieser Liste stehen, wenn es sich um eine Fibonacci-Zahl handelt.Beachten Sie, dass dieser Ansatz für hohe Zahlen, die keine Fibonacci-Zahlen sind, unglaublich ineffizient ist, da alle
n+3
Fibonacci-Zahlen berechnet werden müssen.quelle
Javascript (ES6 ohne den Operator **), 44 Byte
Beruht auf dem Verhältnis zwischen aufeinanderfolgenden Fibonacci-Zahlen, die sich dem Goldenen Schnitt nähern. Der Wert von c ist der Bruchteil der Eingabe geteilt durch den goldenen Schnitt. Wenn die Eingabe Fibonacci ist, liegt dieser Wert nahe bei 1 und der Wert von c-c² ist sehr klein.
Nicht so kurz wie einige der anderen JS-Antworten, läuft aber in O (1) -Zeit.
quelle
Julia 0,4 , 29 Bytes
Probieren Sie es online!
Wenn Sie Julia nicht so antworten, lassen Sie es mich wissen. Ich bin mir nicht sicher, wie die Eingabe bei TIO funktioniert.
quelle
!m=
) oder einem Lambda (Zählenm->
) machen. Noch wichtiger ist, dass dies für 0 so wie es ist fehlschlägt .R
3231 BytesÜbernimmt Eingaben von stdin, kehrt zurück
TRUE
oderFALSE
nach Bedarf.quelle
Common Lisp,
6154 BytesProbieren Sie es online!
Die Verkleinerung gegenüber der Vorgängerversion:
Auslöser war die Idee, dass zur Erzeugung der Folge der Fibonacci-Zahlen nur zwei Variablen erforderlich sind, nicht drei.
quelle
Mathematica, 33 Bytes
quelle
@*
(und dann das Finale ablegen@#&
)JS (ES6), 57 Bytes
Verwendet die Methode von carusocomputing . Viel Golfspieler als meine andere Antwort .
Ungolfed
quelle