Sie können eine Zahl größer als 0 als eindeutige Summe positiver Fibonacci-Zahlen zerlegen. In dieser Frage subtrahieren wir wiederholt die größtmögliche positive Fibonacci-Zahl. Z.B:
1 = 1
2 = 2
3 = 3
4 = 3 + 1
12 = 8 + 3 + 1
13 = 13
100 = 89 + 8 + 3
Nun nenne ich ein Fibonacci-Produkt die gleichen Listen wie oben, aber mit dem Zusatz, der durch Multiplikation ersetzt wird. Zum Beispiel f(100) = 89 * 8 * 3 = 2136
.
Schreiben Sie ein Programm oder eine Funktion, die bei einer positiven Ganzzahl n das Fibonacci-Produkt dieser Zahl zurückgibt.
Testfälle:
1: 1
2: 2
3: 3
4: 3
5: 5
6: 5
7: 10
8: 8
9: 8
42: 272
1000: 12831
12345: 138481852236
code-golf
math
sequence
fibonacci
code-golf
word
code-golf
cipher
code-golf
string
math
subsequence
code-golf
regular-expression
code-golf
brainfuck
assembly
machine-code
x86-family
code-golf
math
factorial
code-golf
math
geometry
code-golf
math
arithmetic
array-manipulation
math
number
optimization
stack
metagolf
code-golf
tips
assembly
code-golf
tips
lisp
code-golf
number-theory
path-finding
code-golf
number
sequence
generation
code-golf
math
geometry
code-golf
grid
permutations
code-golf
code-golf
graphical-output
geometry
fractal
knot-theory
code-golf
math
arithmetic
code-golf
interpreter
balanced-string
stack
brain-flak
code-golf
math
set-theory
code-golf
math
array-manipulation
code-golf
code-golf
string
natural-language
code-golf
code-golf
math
linear-algebra
matrix
code-golf
string
encode
orlp
quelle
quelle
2
kann zerlegt werden als-1 + 3
. Die korrekte Aussage des Satzes von Zeckendorf lautet, dass eine positive Fibonacci-Zahl eindeutig als Summe nicht aufeinanderfolgender Fibonacci-Zahlen mit positivem Index zerlegt werden kann.Antworten:
Jelly ,
1615 BytesNicht besonders schnell oder speicherfreundlich, aber effizient genug für alle Testfälle. Probieren Sie es online!
Wie es funktioniert
quelle
Python, 54 Bytes
Nur eine gute alte Rekursion.
quelle
Perl,
6963 + 4 (-pl61
Flag) = 67 BytesVerwenden von:
Ungolfed:
Ideone .
quelle
061
die ASCII-Codierung für das Zeichen ist'1'
. Nizza Hack zu verwenden$\
, um es fast kostenlos gedruckt zu bekommen.JavaScript (ES6),
7842 BytePort von @ Sp3000's Antwort. Ursprüngliche 78-Byte-Version:
quelle
> <> 57 Bytes
Erwartet, dass die Eingabenummer beim Programmstart auf dem Stack vorhanden ist.
Baut die Fibonacci-Sequenz (
f0, f1, f2, ..., fn
) auf dem Stapel auf, bis eine Zahl erreicht ist, die größer als die Eingabe (i
) ist. Dann wird mit einem Produkt (p
) initialisiert, um1
...Probieren Sie es online aus!
quelle
Pyth, 28 Bytes
Ich denke, es kann viel weiter golfen werden ...
Probieren Sie es online!
quelle
Pyth, 24 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Q
wird mit der Eingangsnummer belegt.Das Teil
h.WgQeH,eZsZ1
berechnet die größte Fibonacci-Zahl, die kleiner oder gleich istQ
Also, wenn
Q = 10
es die Zahlen / Paare erzeugt:Der Rest des Codes berechnet die Partition und multipliziert die Zahlen miteinander:
Es gibt offensichtlich viele kürzere Lösungen (mit wirklich schlechten Laufzeiten), wie z
*FhfqQsTyeM.u,eNsNQ1
.quelle
Haskell, 44 Bytes
Yay für die gegenseitige Rekursion:
a
ist die vorherige Fibonacci-Zahlb
ist die aktuelle Fibonacci-Nummerc
ist der Eingangf
ist die gewünschte FunktionWeniger golfen:
quelle
Eigentlich 22 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Javascript (ES6)
13410692 BytesVielen Dank für @cat, dass Sie ein Leerzeichen entdeckt haben.
Nur eine nicht optimierte Version, die auf meinem Handy erstellt wurde. Sobald ich nach Hause komme, spiele ich Golf. Ideen sind willkommen.
quelle
RETURN , 44 Bytes
Try it here.
Erstaunlicherweise ineffizientes anonymes Lambda, das auf Stack2 resultiert. Verwendung:
HINWEIS: ␌ und ␁ sind Platzhalter für die jeweiligen nicht druckbaren Zeichen: Form Feed und Start of Heading .
Erläuterung
quelle
PHP, 119 Bytes
Der Code (zur besseren Lesbarkeit in zwei Zeilen eingeschlossen):
Die erste Zeile berechnet
$f
die Fibonacci-Zahlen kleiner als$n
(das in der Befehlszeile angegebene Argument). Die zweite Zeile berechnet die Fibonacci-Faktoren (durch Subtraktion) und multipliziert sie, um das Produkt in zu berechnen$o
.Stellen Sie den Code voran
<?php
(technisch nicht Teil des Programms), legen Sie ihn in eine Datei (fibonacci-factors.php
) und führen Sie ihn aus als:Oder starten Sie es mit
php -d error_reporting=0 -r '... code here ...' 100
.Der ungolfed Code und die Testsuite sind auf Github zu finden .
quelle
Q, 47 Bytes
Prüfung
Lies es als Paare (i, map (m, i)), wobei m die Rechenfunktion ist und i die verschiedenen Argumente
schreibt
Erläuterung
n funtion\arg
Wendet die Funktion (function (function (... function (args))) n-mal an (verwendet intern die tal-Rekursion) und gibt die Folge der Ergebnisse zurück. Wir berechnen die 60 ersten Elemente der fibonnaci-Reihe als*+60(|+\)\1 0
. In diesem Fall lautet die Funktion ( | +): + \, das über eine Sequenz angewendet wird, berechnet Teilsummen (ex + \ 1 2 3 ist 1 3 6) und kehrt die Sequenz um. Bei jeder 'Iteration' berechnen wir Teilsummen der beiden vorherigen Fibonacci-Zahlen und geben die Teilsummen zurück sums reverse60(|+\)\1 0
generiert Sequenzen 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...,*+
die über dieses Ergebnis angewendet werden, kippen (traspose) und nehmen das erste. Ergebnis ist Sequenz 1 1 2 3 5 8 13 21 34 55 ..(cond)function\args
Wendet function (function (.. function (args))) an, während cond true ist, und gibt die Folge der Teilergebnisse zurückfunction[arg]
angewendet über eine Funktion von mehr als einem Argument erzeugt eine Projektion (Teilanwendung)Wir können den Argumenten Namen geben, aber die impliziten Namen sind x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
deklariert ein Lambda mit args x, y mit partieller Projektion (arg x ist eine Fibonacci-Reihe, berechnet als * + 60 (| +) \ 1 0). x steht für Fibonacci-Werte und y für die zu verarbeitende Zahl. Die binäre Suche (bin) wird verwendet, um den Index der größeren Fibonacci-Zahl <= y (x bin y
) zu lokalisieren und den entsprechenden Wert von x zu subtrahieren.Um das Produkt aus Teilergebnissen zu berechnen, kehren wir diese um und berechnen die Differenz jedes Paares (
-':|
). Lassen Sie das erste (1_
weil 0) fallen und multiplizieren Sie es mit (*/
).Wenn wir an akkumulierter Summe interessiert sind, ist der Code derselbe, aber mit
+/
statt*/
. Anstelle von + oder * können wir auch jeden anderen diadischen Operator verwenden.Über die Effizienz der Ausführung
Ich weiß, dass Effizienz in diesem Wettbewerb kein Thema ist. Aber in diesem Problem können wir von linearen Kosten bis zu exponentiellen Kosten reichen, also bin ich neugierig.
Ich entwickelte eine zweite Version (Länge 48 Bytes ohne Kommentar) und wiederholte 1000-mal Testfälle Batterie auf beiden Versionen.
Ausführungszeit ist: Originalversion 0'212 seg, neue Version 0'037 seg
Die Originalversion berechnet die Fibbonaci-Serie einmal pro Funktionsanwendung. Neue Version berechnet Fibonacci nur eine.
In beiden Fällen verwendet die Berechnung der Fibonacci-Reihe die Schwanzrekursion
quelle