Fibonacci-Zahlen
Fibonacci - Zahlen beginnen mit f(1) = 1
und f(2) = 1
(etwas enthält , f(0) = 0
aber dies ist auf diese Herausforderung irrelevant. Dann wird für n > 2
, f(n) = f(n-1) + f(n-2)
.
Die Herausforderung
Ihre Aufgabe ist es, die n
-te positive Zahl zu finden und auszugeben, die als Produkte von Fibonacci-Zahlen ausgedrückt werden kann. Sie können wählen, ob der Index 0 oder 1 sein soll, je nachdem, was für Sie am besten geeignet ist. Dies müssen Sie jedoch in Ihrer Antwort angeben.
Außerdem muss Ihre Antwort die 100. Amtszeit in angemessener Zeit berechnen.
Testfälle
n result corresponding product (for reference)
1 1 1
2 2 2
3 3 3
4 4 2*2
5 5 5
6 6 2*3
7 8 2*2*2 or 8
8 9 3*3
9 10 2*5
10 12 2*2*3
11 13 13
12 15 3*5
13 16 2*2*2*2 or 2*8
14 18 2*3*3
15 20 2*2*5
16 21 21
17 24 2*2*2*3 or 3*8
18 25 5*5
19 26 2*13
20 27 3*3*3
100 315 3*5*21
Verweise
code-golf
number-theory
fibonacci
Undichte Nonne
quelle
quelle
7
kann nicht als Produkt von Fibonacci-Zahlen ausgedrückt werden. Daher ist die1
erste erforderliche Zahl1
, die2
zweite ist2
, ..., die6
dritte ist6
, aber die7
dritte ist8
.corresponding product
" dient nur zur Verdeutlichung. Ihr Code muss nur das "result
" ausgeben .Antworten:
Jelly ,
26242321 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Julia, 79 Bytes
Probieren Sie es online!
Hintergrund
In Advanced Problems and Solutions ist H-187: Fibonacci ein Quadrat , wie der Antragsteller zeigt
Dabei bezeichnet L n die n- te Lucas-Zahl und umgekehrt, wenn
dann ist n eine Fibonacci-Zahl und m ist eine Lucas-Zahl.
Wie es funktioniert
Wir definieren den binären Operator
<|
für unsere Zwecke. Es ist in neueren Versionen von Julia nicht definiert, wird jedoch vom Parser weiterhin als Operator erkannt.Bei Aufruf mit nur einem Argument ( n ) wird k als 1
<|
initialisiert . Während n positiv ist, subtrahiert es ! K ( 1, wenn k ein Produkt von Fibonacci-Zahlen ist, 0, wenn nicht) von n und ruft sich selbst rekursiv auf und erhöht k um 1 . Sobald n 0 erreicht , wurde die gewünschte Menge an Produkten gefunden, und es wird der vorherige Wert von k zurückgegeben , dh ~ -k = k - 1 .<|
Der
!
als Test für Fibonacci- Zahlenprodukte neu definierte unäre Operator erfüllt seine Aufgabe wie folgt.Wenn k = 1 ist , ist k ein Produkt von Fibonacci-Zahlen. In diesem Fall erhöhen wir den Rückgabewert von
any(...)
auf die Potenz ~ -k = k - 1 = 0 , sodass das Ergebnis 1 ist .Wenn k> 1 ist , ist das Ergebnis der Wert von
any(....)
, der genau dann true√(5i^2+[4,-4])%1∋k%i<!(k÷i)
zurückgibt, wenn das Prädikat für eine ganze Zahl i true zurückgibt , sodass 2 ≤ i ≤ k ist .Die verketteten Bedingungen im Prädikat gelten, wenn sie
k%i
zu gehören√(5i^2+[4,-4])%1
undk%i
kleiner als sind!(k÷i)
.√(5i^2+[4,-4])%1
Nimmt die Quadratwurzel von 5i 2 + 4 und 5i 2 - 4 und berechnet ihre Reste modulo 1 . Jeder Modul ist 0, wenn die entsprechende Zahl ein perfektes Quadrat ist, und eine positive Zahl, die ansonsten kleiner als 1 ist .Da
k%i
eine ganze Zahl zurückgegeben wird, kann sie nur dann zum Array von Modulen gehören, wenn k% i = 0 ist (dh k ist durch i teilbar ) und mindestens eines von 5i 2 + 4 und 5i 2 - 4 ein perfektes Quadrat ist (dh Ich bin eine Fibonacci-Zahl.!(k÷i)
Ruft rekursiv 1 mit dem Argument k ÷ i (Ganzzahldivision) auf, das genau dann größer als 0 ist, wenn k ÷ i ein Produkt von Fibonacci-Zahlen ist.Durch Induktion ! hat die gewünschte Eigenschaft.
quelle
Python, 90 Bytes
Die Hauptfunktion
g
gibt dask
Fibonacci-Produkt 1-indiziert aus. Es rechnetg(100)
wie315
fast augenblicklich. Dies gilt auch für ein allgemeines rekursives Rezept, bei demn
nachk
Instanzen gesucht wird , die die Funktion erfüllenf
. Jede dieser Instanzen senkt die erforderliche Anzahl,k
bis sie erreicht ist0
.Die Hilfsfunktion
f
testet eine Zahl als Fibonacci-Produkt. Es generiert rekursiv die Fibonacci-Zahlen in seinen optionalen Argumentena
undb
. Es gibt "Ja" aus, wenn eine der folgenden Bedingungen erfüllt ist:n<2
. Dies impliziertn==1
, das triviale Produkt)n%a<f(n/a)
. Dies erfordertn%a==0
undf(n/a)==True
, dh dasn
ist ein Vielfaches der Fibonacci-Zahla
, und das Entfernen dieses Faktors ergibta
immer noch ein Fibonacci-Produkt.n-a>0<f(n,b,a+b)
äquivalent zun>a and f(n,b,a+b)
. Überprüft, ob die aktuell getestete Fibonacci-Zahl mindestens son
groß ist und ob eine größere Fibonacci-Zahl funktioniert. Vielen Dank an Dennis für das Speichern von 2 Bytes mithilfe des Ungleichheitskurzschlusses anstelle vonand
.Die Funktion
g
kann ein Byte kürzer sein alswenn
g(k)
es höchstens immer istk*k
, was ich nicht sicher bin, ist asymptotisch wahr. Eine Schranke2**k
reicht aus,g(100)
dauert dann aber zu lange. Vielleicht kann stattdessen das rekursive vong
in durchgeführt werdenf
.quelle
g(k)
überschreitetk*k
wannk = 47000
und oben.Perl 6 ,
9593 Bytes(0 basierter Index)
Prüfung:
Erläuterung:
quelle
Python 3,
175170148 BytesVielen Dank an @Dennis für -22 Bytes
Nimmt Eingaben von STDIN und druckt auf STDOUT. Dies ist einindexiert. Die Berechnung des 100. Terms dauert ungefähr eine Zehntelsekunde.
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
Python 2,
120107 BytesTeste es auf Ideone .
Wie es funktioniert
Wir initialisieren F als Tupel (2, 3) (die ersten beiden Fibonacci-Zahlen größer als 1 ), k als 0 und n als Ganzzahl, die aus STDIN gelesen wird.
Während n positiv ist, machen wir Folgendes:
Hänge die nächste Fibonacci-Zahl, berechnet als F [k] + F [-1] , dh die Summe der letzten beiden Elemente von F an das Tupel F an .
Inkrement k .
Subtrahiere g (k) von n .
g gibt genau dann 1 zurück, wenn k ein Produkt von Fibonacci-Zahlen ist. Wenn n also 0 erreicht , ist k die n- te Fibonacci-Zahl und wir geben sie an STDOUT aus.
g erreicht seinen Zweck wie folgt.
Wenn k ist 1 , ist es ein Produkt der Fibonacci - Zahlen, und
1/k
stellt sicher , dass wir zurückkommen 1 .Wenn k größer als 1 ist , rufen wir
g(k/i)
rekursiv für alle Fibonacci-Zahlen i in F auf .g(k/i)
testet rekursiv, ob k / i ein Fibonacci-Zahlenprodukt ist. Wenng(k/i)
Returns 1 und i aufteilt k gleichmäßig, k% i = 0 und der Zustandk%i<g(k/i)
hält, so g wird wieder 1 , wenn und nur wenn es eine Fibonacci - Zahl , die so ist , dass k das Produkt aus der Fibonacci - Zahl , und ein weiteres Produkt der Fibonacci - Zahlen.quelle
JavaScript (ES6), 136
Auf diese Weise ist das Golfen ziemlich langsam, da ich auf meinem PC Term 100 in ungefähr 8 Sekunden berechnet habe.
Weniger Golf und auch schneller (Ausweichen
eval
)Prüfung
quelle
Haskell, 123 Bytes
Sehr faul, unendlich viel!
Möglicherweise nicht der kurze Weg, aber ich musste diesen Ansatz ausprobieren, eine Verallgemeinerung einer ziemlich bekannten Methode, um die Liste der Hamming-Zahlen zu berechnen.
f
ist die Liste der Fibonacci-Zahlen, die mit 2 beginnt. Der Kürze halber sei ein lol (Liste von Listen) eine unendliche Liste von geordneten unendlichen Listen, geordnet nach ihren ersten Elementen.m
ist eine Funktion, um ein lol zusammenzuführen und Duplikate zu entfernen. Es werden zwei Infix-Hilfsfunktionen verwendet.?
fügt eine unendliche sortierte Liste in ein lol ein.#
Entfernt einen Wert aus einem lol, der als Kopf der ersten Liste erscheinen kann, und fügt die verbleibende Liste mit wieder ein?
.Schließlich
l
ist die Liste der Zahlen, die Produkte von Fibonacci-Zahlen sind, definiert als 1, gefolgt von der Zusammenführung aller durch Multiplikation erhaltenen Listenl
mit einer Fibonacci-Zahl erhalten werden. Die letzte Zeile gibt die erforderliche Funktion an (wie üblich, ohne sie an einen Namen zu binden, kopieren Sie sie also nicht so wie sie ist), indem Sie!!
in die Liste indexieren, wodurch die Funktion 0-indexiert wird.Es ist kein Problem, die 100. oder 100.000. Zahl zu berechnen.
quelle
Schale , 13 Bytes
Beachten Sie, dass Husk neuer als diese Herausforderung ist. Es und die nützlichste Funktion für diesen Golf (
Ξ
) wurden jedoch nicht unter Berücksichtigung dieser Herausforderung erstellt.Probieren Sie es online!
Effizientere Version für 14 Bytes:
Probieren Sie es online!
quelle
Python 2,
129128125123121 ByteTeste es auf Ideone .
quelle