Über Zeckendorf Vertretungen / Basis Fibonacci Nummern
Dies ist ein Zahlensystem, das Fibonacci-Zahlen als Basis verwendet. Die Zahlen bestehen aus 0 und 1 und jede 1 bedeutet, dass die Zahl die entsprechende Fibonacci-Zahl enthält, und 0 bedeutet, dass dies nicht der Fall ist.
Lassen Sie uns zum Beispiel alle natürlichen Zahlen <= 10 in Basis-Fibonacci konvertieren.
1 wird 1, weil es die Summe von 1 ist, die eine Fibonacci-Zahl ist,
2 wird zu 10, weil es sich um die Summe von 2 handelt, die eine Fibonacci-Zahl ist, und es wird keine 1 benötigt, weil wir bereits die gewünschte Summe erreicht haben.
3 wird zu 100, weil es sich um die Summe von 3 handelt, die eine Fibonacci-Zahl ist und keine 2 oder 1 benötigt, weil wir bereits die gewünschte Summe erreicht haben.
- 4 wird 101, weil es die Summe von [3,1] ist, die beide Fibonacci-Zahlen sind.
- 5 wird zu 1000, da es sich um die Summe von 5 handelt, die eine Fibonacci-Zahl ist, und wir keine der anderen Zahlen benötigen.
- 6 wird 1001, weil es die Summe der Fibonacci-Zahlen 5 und 1 ist.
- 7 wird 1010, weil es die Summe der Fibonacci-Zahlen 5 und 2 ist.
- 8 wird zu 10000, da es sich um eine Fibonacci-Zahl handelt.
- 9 wird 10001, weil es die Summe der Fibonacci-Zahlen 8 und 1 ist.
- 10 wird zu 10010, weil es die Summe der Fibonacci-Zahlen 8 und 2 ist.
Lassen Sie uns eine zufällige Basis-Fibonacci-Zahl, 10101001010, in eine Dezimalzahl umwandeln: Zuerst schreiben wir die entsprechenden Fibonacci-Zahlen. Dann berechnen wir die Summe der Zahlen unter 1.
1 0 1 0 1 0 0 1 0 1 0
144 89 55 34 21 13 8 5 3 2 1 -> 144+55+21+5+2 = 227.
Lesen Sie mehr über Base Fibonacci-Zahlen: link , es gibt auch ein Tool, das reguläre Ganzzahlen in Base Fibonacci umwandelt. Sie können damit experimentieren.
Nun die Frage:
Ihre Aufgabe ist es, eine Zahl in die Zeckendorf-Darstellung aufzunehmen und deren Dezimalwert auszugeben.
Die Eingabe ist eine Zeichenfolge, die nur 0 und 1 enthält (obwohl Sie die Eingabe beliebig verwenden können).
Geben Sie eine Dezimalzahl aus.
Testfälle: (im Format Eingabe-> Ausgabe)
1001 -> 6
100101000 -> 73
1000000000 -> 89
1001000000100100010 -> 8432
1010000010001000100001010000 -> 723452
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
Hinweis: Der Eingang enthält keine führenden Nullen oder aufeinander folgenden Einsen.
Antworten:
Taxi ,
19871927 Bytes-60 Byte aufgrund der Erkenntnis, dass Zeilenumbrüche optional sind.
Probieren Sie es online!
Da ich am Ende nicht in die Taxigarage zurückkehre, feuert mich mein Chef und es wird mit einem Fehler beendet.
quelle
Joyless Park
scheint ein schöner Ort zu seinSunny Skies Park
.Perl 6 ,
2823 BytesProbieren Sie es online!
Anonymer Codeblock, der eine Liste von
1
s und0
s in der LSB-Reihenfolge aufnimmt und eine Zahl zurückgibt.Erläuterung:
quelle
Gelee , 5 Bytes
Ein monadischer Link, der eine Liste in Little-Endian-Form akzeptiert (dh vom LSB links zum MSB rechts).
Probieren Sie es online!
quelle
J‘ÆḞḋṚ
.Wolfram Language (Mathematica) ,
35322928 BytesProbieren Sie es online!
quelle
Haskell , 38 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Liste von Einsen und Nullen.
Erläuterung
Erstellt eine Liste der Fibonacci-Zahlen ohne die erste, in Variablen
f
.Nimmt die Eingabeliste,
reverse
multipliziert sie jeden Eintrag mit dem entsprechenden Eintrag inf
, dannsum
die Ergebnisse.Haskell , 30 Bytes
Probieren Sie es online!
Wenn wir die Eingabe mit dem niedrigstwertigen Bit zuerst einlesen, brauchen wir das nicht,
reverse
sodass wir 8 Bytes sparen können.quelle
Python 2 , 43 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Liste. Das Update ist eine kürzere Version von
a,b=b+x,a+b+x
, die dem Fibonacci-Update gleicht,a,b=b,a+b
wenn Sie es ignorierenx
.Python 2 , 45 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Dezimalzahl.
quelle
Pyth, 13 Bytes
Das meiste davon (8 Bytes) generiert nur die Fibonacci-Zahlen.
Probieren Sie es mit dieser Testsuite aus!
Erläuterung:
quelle
Brain-Flak ,
110,102,96,94,78, 74 BytesProbieren Sie es online!
quelle
J ,
24BytesProbieren Sie es online!
Die 24-Byte-Version, die die gemischte Basis für Fibonacci verwendet, wurde verbessert.
Wie es funktioniert
J , 21 Bytes
Probieren Sie es online!
Verfeinerte Version der 25-Byte-Lösung von Galen Ivanov .
Verwendet die diagonale Summe des Pascalschen Dreiecks, die der Summe der Binomialkoeffizienten entspricht:
Wie es funktioniert
J , 24 Bytes
Probieren Sie es online!
Monadisches explizites Verb. Erzeugt die gemischte Basis, die die Fibonacci-Basis darstellt, und fließt dann in die Basiskonvertierung ein
#.
.Wie es funktioniert
Alternativen
J , 27 Bytes
Probieren Sie es online!
Die Idee:
J , 30 Bytes
Probieren Sie es online!
Dieser hat die meiste Mühe gemacht, um zu bauen. Verwendet den Ausdruck in geschlossener Form mit Rundungstrick. In dem Ausdruck sind der 0. und der 1. Wert 0 bzw. 1, daher muss die tatsächliche Ziffernstärke mit 2 beginnen.
Der Fehler (
((1-sqrt(5))/2)^n
Terme) kann sich zwar aufbauen, überschreitet jedoch nie 0,5, sodass der Rundungstrick bis unendlich funktioniert. Mathematisch:quelle
MathGolf ,
86 BytesProbieren Sie es online!
Erläuterung
Dank JoKing 1 Byte und dank LSB-Bestellung ein weiteres Byte eingespart.
quelle
05AB1E ,
1198 BytesProbieren Sie es online!
Erläuterung:
quelle
Θ
.1
ist in 05AB1E schon wahr. :)2+
Kann auch seinÌ
.Python 3 , 63 Bytes
Probieren Sie es online!
Übernimmt die Eingabe über STDIN als Zeichenfolge.
quelle
Rot ,
142, 126106 BytesProbieren Sie es online!
quelle
Ruby , 39 Bytes
Probieren Sie es online!
quelle
Stax , 6 Bytes
Führen Sie es aus und debuggen Sie es
Ziemlich einfach. LSB-Bestellung.
quelle
Brain-Flak , 40 Bytes
Probieren Sie es online!
quelle
C (gcc) 63 Bytes
Nimmt die Eingabe als Array von
1
's und0
' s zusammen mit der Länge des Arrays. Diese Lösung ist eine eher unkomplizierte Rückwärtsschleife.Probieren Sie es online!
quelle
Prolog (SWI) , 74 Bytes
Probieren Sie es online!
Nimmt die Eingabe als Liste von Ganzzahlen 1 und 0, wobei das höchstwertige Bit an erster Stelle steht.
quelle
Retina 0.8.2 , 23 Bytes
Probieren Sie es online! Link enthält die schnelleren Testfälle. Erläuterung:
Fügen Sie überall Trennzeichen ein und löschen Sie alle Nullen. Zum Beispiel
1001
wird;1;;;1;
.Ersetzen wiederholt jeweils
1
mit einem1
an jeder der nächsten zwei Stellen, da die Summe ihrer Werte dem Wert des Originals entspricht1
.1
s migrieren und akkumulieren daher, bis sie die letzten beiden Stellen erreichen, die (aufgrund des neu hinzugefügten Trennzeichens) nun beide Wert haben1
.Zähle die
1
s.quelle
Japt
-x
, 9 BytesVersuch es
quelle
JavaScript (Node.js) , 41 Byte
Ein Hafen von Xnors Antwort . Übernimmt die Eingabe als BigInt-Literal.
Probieren Sie es online!
JavaScript (ES6), 44 Byte
Nimmt die Eingabe als Array von Zeichen in der Reihenfolge LSB-First an.
Probieren Sie es online!
quelle
Eigentlich 8 Bytes
Probieren Sie es online!
Die Eingabe wird als Liste von Bits in der Reihenfolge LSB-First verwendet.
Erläuterung:
quelle
Powershell, 68 Bytes
Testskript:
Ausgabe:
quelle
Java (OpenJDK 8) , 65 Byte
Ziemlich klein für eine Java-Antwort, damit bin ich zufrieden. Nimmt Eingaben als ein LSB-erstes geordnetes Array von Ints an.
Probieren Sie es online!
Ungolfed
quelle
Z80Golf , 34 Bytes
Beispiel mit Eingabe 1001-Online ausprobieren!
Beispiel mit Eingabe 100101000-Online ausprobieren!
Versammlung:
quelle