Die berühmte Fibonacci-Sequenz lautet F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)
(für diese Herausforderung beginnen wir mit 0).
Ihre Herausforderung: Geben Sie bei n die Summe aller d- ten Fibonacci-Zahlen für alle Teiler d der n- ten Fibonacci-Zahl aus. Wenn Sie mehr formale Notation bevorzugen,
Eingabe : eine positive ganze Zahl n
Ausgabe : die Summe
Zum Beispiel betrachten n=4
. F(4) = 3
Die Teiler von 3 sind 1 und 3, daher sollte die Ausgabe sein F(1) + F(3) = 1 + 2 = 3
.
Für n=6
, F(6) = 8
und die Divisoren von 8 sind 1, 2, 4, 8, die Ausgabe ist also F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26
.
Testfälle:
1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26
Dies ist Code-Golf , die kürzeste Antwort in Bytes gewinnt. Es gelten Standardlücken .
code-golf
number-theory
fibonacci
division
Neil A.
quelle
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Mathematica, 29 Bytes
quelle
Mathematica Simplified , 14 Byte
Na ja, das war letztendlich identisch mit der @ MartinEnder-Lösung ...
quelle
N
Japt , 11 Bytes
Probieren Sie es online!
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
Haskell, 54 Bytes
Anwendungsbeispiel:
g 6
->26
. Probieren Sie es online!quelle
Alice ,
3836 BytesDanke an Leo für das Speichern von 2 Bytes.
Probieren Sie es online!
Mit ziemlicher Sicherheit nicht optimal. Der Kontrollfluss ist ziemlich kompliziert und obwohl ich ziemlich zufrieden bin mit der Anzahl der Bytes, die gegenüber früheren Versionen gespeichert wurden, habe ich das Gefühl, dass ich Dinge, die einfacher sein könnten, überkompliziere und kürzere Lösung .
Erläuterung
Zuerst muss ich etwas über Alices Return Address Stack (RAS) herausfinden. Wie viele andere Fungeoids hat Alice den Befehl, im Code herumzuspringen. Es gibt jedoch auch Befehle, mit denen Sie zu Ihrem Ursprungsort zurückkehren können, sodass Sie Subroutinen ganz bequem implementieren können. Da es sich um eine 2D-Sprache handelt, existieren Unterprogramme natürlich nur nach Konvention. Es gibt nichts, was Sie daran hindert, eine Unterroutine mit anderen Mitteln als einem Rückkehrbefehl (oder an einem beliebigen Punkt in der Unterroutine) zu betreten oder zu verlassen, und je nachdem, wie Sie den RAS verwenden, gibt es möglicherweise ohnehin keine saubere Sprung- / Rückkehrhierarchie.
Im Allgemeinen wird dies implementiert, indem der Sprungbefehl
j
die aktuelle IP-Adresse zum RAS überträgt, bevor der Sprung ausgeführt wird. Der Rücksprungbefehl gibtk
dann eine Adresse des RAS aus und springt dorthin. Wenn der RAS leer ist,k
geschieht gar nichts.Es gibt auch andere Möglichkeiten, den RAS zu manipulieren. Zwei davon sind für dieses Programm relevant:
w
schiebt die aktuelle IP-Adresse zum RAS, ohne irgendwo zu springen. Wenn Sie diesen Befehl wiederholen, können Sie ganz bequem einfache Schleifen schreiben&w...k
, wie ich es bereits in früheren Antworten getan habe.J
ist wiej
, merkt sich aber nicht die aktuelle IP-Adresse auf dem RAS.Es ist auch wichtig zu beachten, dass der RAS keine Informationen über die Richtung der IP speichert . Wenn Sie also zu einer Adresse mit zurückkehren,
k
wird immer die aktuelle IP-Richtung beibehalten (und daher auch, ob Sie sich im Kardinal- oder Ordinal-Modus befinden), unabhängig davon, wie wir die IP-Adresse durchlaufen habenj
oder durchw
welche die IP-Adresse übertragen wurde.Nachdem dies erledigt ist, schauen wir uns zunächst die Subroutine im obigen Programm an:
Diese Unterroutine zieht das untere Element des Stapels n nach oben und berechnet dann die Fibonacci-Zahlen F (n) und F (n + 1) (wobei sie oben auf dem Stapel verbleiben). Wir brauchen niemals F (n + 1) , aber es wird außerhalb der Unterroutine verworfen, da
&w...k
Schleifen mit dem RAS interagieren (was erfordert, dass diese Schleifen am Ende sind) einer Unterroutine sein müssen). Der Grund, warum wir Elemente von unten anstelle von oben verwenden, besteht darin, dass wir den Stapel eher wie eine Warteschlange behandeln. Das heißt, wir können alle Fibonacci-Zahlen auf einmal berechnen, ohne sie an einer anderen Stelle speichern zu müssen.So funktioniert dieses Unterprogramm:
Das Ende der Schleife ist etwas knifflig. Solange sich eine Kopie der 'w'-Adresse auf dem Stapel befindet, wird die nächste Iteration gestartet. Sobald diese erschöpft sind, hängt das Ergebnis davon ab, wie die Unterroutine aufgerufen wurde. Wenn das Unterprogramm mit 'j' aufgerufen wurde, kehrt das letzte 'k' dorthin zurück, sodass das Schleifenende als Rückkehr des Unterprogramms gilt. Wenn das Unterprogramm mit 'J' aufgerufen wurde und es noch eine Adresse von früher auf dem Stapel gibt, springen wir dorthin. Dies bedeutet, wenn das Unterprogramm in einer äußeren Schleife selbst aufgerufen wurde, kehrt dieses 'k' zum Anfang dieser äußeren Schleife zurück. Wurde das Unterprogramm mit 'J' aufgerufen, aber der RAS ist jetzt leer, dann macht dieses 'k' nichts und die IP bewegt sich einfach weiter nach der Schleife. Wir werden alle drei dieser Fälle im Programm verwenden.
Zum Schluss zum Programm selbst.
Dies sind nur zwei schnelle Exkursionen in den Ordnungsmodus, um Dezimalzahlen zu lesen und zu drucken.
Nach dem
i
gibt es einen,w
der sich aufgrund der Sekunde die aktuelle Position merkt, bevor er in das Unterprogramm übergeht/
. Dieser erste Aufruf des Unterprogramms berechnetF(n)
und übergibtF(n+1)
die Eingaben
. Danach springen wir zurück, aber wir ziehen jetzt nach Osten, also der Rest der Programmoperatoren im Kardinalmodus. Das Hauptprogramm sieht folgendermaßen aus:Hier
31J
ist ein weiterer Aufruf des Unterprogramms und berechnet daher eine Fibonacci-Nummer.quelle
Axiom, 68 Bytes
ein Test
quelle
Pari / GP , 34 Bytes
Probieren Sie es online!
quelle
Python 2 ,
8984 Bytes-5 Bytes dank ovs
Probieren Sie es online!
quelle
R, 77 Bytes
Verwendet die 'gmp'-Bibliothek. Dies hat eine eingebaute Fibonacci-Funktion und bietet die Möglichkeit, große Zahlen zu machen. Es verursachte ein paar Probleme mit seqs und applys, obwohl es immer noch kleiner ist, als meine eigene Fibonacci-Funktion zu erstellen.
Erläuterung
Prüfung
Ohne Verwendung von gmp
81 Bytes , rekursive Funktion, die hoffnungslos langsam ist, wenn große (9+) Zahlen ausgewählt werden
88 Bytes , die Binet-Formel, die mit größeren Zahlen einigermaßen gut funktioniert, aber dennoch recht schnell die Ganzzahlgrenze erreicht
quelle
Perl 6 , 49 Bytes
quelle
CJam , 26 Bytes
Probieren Sie es online!
Ich bin sicher, dass es besser geht. Erläuterung:
Die Idee ist, ein Array von Fibonacci-Zahlen zu haben und dieses mit einem Array mit 1 und 0 zu versehen, wenn diese Zahl ein Teiler der Eingabe ist oder nicht.
quelle
JavaScript (ES6),
7665 BytesTestfälle
Code-Snippet anzeigen
quelle
JavaScript (ES6),
10510410310197 ByteVersuch es
quelle
(z=g(i)/y)>~~z
zu(z=g(i)/y)%1
, wenn Sie gerade prüfen, obz
eine ganze Zahl ist.g(z)
auf geändert wird,g(z|0)
der uns jedoch wieder auf die gleiche Byteanzahl zurückbringt .Q, 75 Bytes
quelle
C (GCC) ,
939080 BytesProbieren Sie es online!
quelle
++ hinzufügen , 89 Bytes
Probieren Sie es online!
quelle