Binäre Fibonacci


31

Herausforderung

Sie müssen ein Programm oder eine Funktion generieren, die eine positive Ganzzahl N aufnimmt, die ersten N Terme der Fibonacci-Sequenz in Binärform berechnet, sie zu einer einzelnen Binärzahl verkettet, diese Zahl zurück in Dezimalform konvertiert und dann die Dezimalform als ausgibt ganze Zahl.

Beispielsweise

1 -> [0] -> 0 to decimal outputs 0
3 -> [0, 1, 1] -> 011 to decimal outputs 3
4 -> [0, 1, 1, 10] -> 01110 to decimal outputs 14

Sie müssen nicht ->nur die Nummer ausgeben (z. B. wenn der Benutzer tippt 4, nur ausgeben 14). Die Pfeile sollen nur erklären, was das Programm tun muss.

Testfälle

1 -> 0
2 -> 1
3 -> 3
4 -> 14
5 -> 59
6 -> 477
7 -> 7640
8 -> 122253
9 -> 3912117
10 -> 250375522
11 -> 16024033463
12 -> 2051076283353
13 -> 525075528538512
14 -> 134419335305859305
15 -> 68822699676599964537
16 -> 70474444468838363686498
17 -> 72165831136090484414974939
18 -> 147795622166713312081868676669
19 -> 605370868394857726287334099638808
20 -> 4959198153890674493745840944241119317

Das Programm muss in der Lage sein, bis zur Grenze der verwendeten Sprache auszugeben. Nachschlagetabellen oder allgemeine Problemumgehungen sind nicht zulässig.

Das ist , also gewinnt die Antwort mit der kürzesten Anzahl von Bytes!


1
Testfälle von 0 bis 20 aus tio.run/##DYxBCoQwDAC/… hinzugefügt . Dank an @alephalpha für das Programm.
Nathan Wood

6
Wie noch nicht gesagt: Willkommen bei PPCG! Schöne erste Herausforderung.
Laikoni

@Laikoni Danke!
Nathan Wood

Wo genau gilt das sprachspezifische Limit? Wäre eine C-Funktion zulässig, die eine 32-Bit-Ganzzahl zurückgibt? Wie int32_t binary_concat_Fib(int n), was den resultierenden Ausgabewert auf 2 ^ 31-1 begrenzen würde. Sie können also annehmen, dass alle verketteten Bits in eine ganze Zahl passen. Oder sollte die Funktion bis zu dem Punkt funktionieren, an dem die größte Fibonacci-Zahl nicht für sich allein in eine Ganzzahl passt, sodass die Verkettung der Bits eine höhere Genauigkeit erfordert?
Peter Cordes

1
Und müssen die "Konvertierungen in Dezimalzahlen" explizit sein, eine Integer-> String-Funktion aufrufen oder selbst schreiben? Durch Verketten der Bits zu einer einzelnen Ganzzahl erhalten Sie eine Darstellung des Endwerts. Wenn ich das richtig verstehe, gibt Dennis 'Python-Antwort eine Ganzzahl zurück und überlässt es dem Aufrufer, diesen Wert in eine Dezimalzeichenfolge umzuwandeln oder irgendetwas damit zu tun. Ganzzahlige Werte in Computersprachen, die Bitverschiebungsoperatoren unterstützen, sind natürlich binär und nicht dezimal, es sei denn, sie werden in Zeichenfolgen gespeichert. In Sprachen ohne Verschiebungen / bitweise Operatoren impliziert nichts eine Basis.
Peter Cordes

Antworten:



10

Gelee ,  7  6 Bytes

ḶÆḞBẎḄ

Probieren Sie es online!

Wie?

ḶÆḞBẎḄ - Link: integer, n
Ḷ      - lowered range -> [0,1,2,3,4,5,...,n]
 ÆḞ    - Fibonacci (vectorises) -> [0,1,1,2,3,5...,F(n)]
   B   - to binary (vectorises) -> [[0],[1],[1],[1,0],[1,1],[1,0,1],...,B(F(n))]
    Ẏ  - tighten -> [0,1,1,1,0,1,1,1,0,1,...,B(F(n))[0],B(F(n))[1],...]
     Ḅ - from binary -> answer

1
Ich spielte mit den neuen Quicks und fand heraus, dass die ersten n Fibonacci-Zahlen auch mit Ṛc’SƲƤdenen gefunden werden können, die für ähnliche Sequenzen nützlich sein könnten.
Meilen


7

Brainfuck , 397 Bytes

>,[<++++++[->--------<]>>[->++++++++++<]>[-<+>]<<[->+<],]>+[-<<+>>[-[->+<]<<[->+>+<<]<[->+>+<<]>[-<+>]>>[-<<+>>]>]]<<[->+>>>>>+<<<<<<]>[-<+>]>+>>+>>>+<[[->-[<<]>]>[[-]<<<<<<<[->>[-<+>>+<]>[-<+>]<<<]<[->+>>>>>+<<<<<<]>[-<+>]>[-<+>]>[->>[-<+<<+>>>]<[->+<]<]>+>[-]>>+>]<<<<<[[->++>+>++<<<]>[-<+>]<<]>>>]>[-]<<<[-]<<[-]<<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>>>]<+[->++++++[-<++++++++>]<.<<<+]

Na das war ein Spaß!

Übernimmt ASCII-Eingaben (zB 11), gibt ASCII aus.

Hinweis: Um dies online zu versuchen, stellen Sie sicher, dass Sie die Zellengröße auf 32 Bit einstellen (auf der rechten Seite der Webseite). Wenn Sie keine Eingabe machen, kann Ihr Browser abstürzen.

Der Interpreter kann keine Eingaben von 11und höher verarbeiten, da er nur bis zu 32 Bit unterstützt.

Probieren Sie es auf copy.sh

Erläuterung

>,[<++++++[->--------<]>>[->++++++++++<]>[-<+>]<<[->+<],]>+

Holen Sie sich eine Dezimaleingabe und fügen Sie eine hinzu

[-<<+>>[-[->+<]<<[->+>+<<]<[->+>+<<]>[-<+>]>>[-<<+>>]>]]

Generieren Sie Fibonacci-Zahlen auf dem Band.

<<[->+>>>>>+<<<<<<]>[-<+>]>+>>+>>>+<

Richten Sie für die eingehende binäre Verkettungsschleife ein


Die Zellen enthalten also den Wert, beginnend mit der ersten Position,

1 | 0 | 1 | 1 | 2 | 3 | 5 | ... | f_n | 0 | 1 | 0 | 1 | 0 | f_n | 1 | 0 | 0 | 0...

Sehen Sie sich diese Zellen an:

f_n | 0 | 1 | 0 | 1 | 0 | f_n | 1

Ich werde dies beschriften:

num | sum | cat | 0 | pow | 0 | num | pow

powgibt es die maximale Potenz von 2 zu finden, die streng größer ist als num. sumist die Verkettung von Zahlen bisher. catist die Macht der 2 , dass ich die multiplizieren müsste , numum zu verketten numvor dem sum(so würde ich in der Lage sein, einfach zu hinzufügen).


[[->-[<<]>]>

Schleife: Überprüfen Sie, ob f_nstreng kleiner als ist pow.

Wahrheit:

[[-]<<<<<<<[->>[-<+>>+<]>[-<+>]<<<]<[->+>>>>>+<<<<<<]>[-<+>]>[-<+>]>[->>[-<+<<+>>>]<[->+<]<]>+>[-]>>+>]

Null Junk raus. Fügen Sie dann num* catzu hinzu sum. Laden Sie als nächstes die nächste Fibonacci-Zahl (= f_(n-1); falls sie nicht existiert, beenden Sie die Schleife) und setzen Sie sie catauf cat* pow. Bereiten Sie sich auf die nächste Schleife vor (Null aus mehr Müll, Bereich um eins verschieben).

Falsey:

<<<<<[[->++>+>++<<<]>[-<+>]<<]

Auf pow2 * setzen pow, wiederherstellen num.

]

Wiederholen, bis keine Fibonacci-Nummer mehr vorhanden ist.


>[-]<<<[-]<<[-]<<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>>>]<+[->++++++[-<++++++++>]<.<<<+]

Müll säubern. Nimm jede Ziffer der resultierenden Zahl und gib sie aus (in ASCII).


7

Schale , 7 Bytes

ḋṁḋ↑Θİf

Probieren Sie es online!

Erläuterung

ḋṁḋ↑Θİf                              4
     İf    The Fibonacci numbers     [1,1,2,3,5,8..]
    Θ      Prepends 0                [0,1,1,2,3,5..]
   ↑     Take n elements from list   [0,1,1,2]
  ḋ        Convert to binary digits  [[0],[1],[1],[1,0]]
 ṁ       Map function then concat    [0,1,1,1,0]
ḋ        Convert from base 2         14

Willkommen bei PPCG! :)
DJMcMayhem

5

Japt , 9 Bytes

ÆMgX ¤Ã¬Í

Starte es

Erläuterung:

ÆMgX ¤Ã¬Í
Æ     Ã     | Iterate X through the range [0...Input]
 MgX        |   Xth Fibonacci number
     ¤      |   Binary
       ¬    | Join into a string
        Í   | Convert into a base-2 number

1
Bah! Schlagen Sie mich dazu!
Shaggy

1
@ Shaggy Ich wusste, dass dies ein Rennen gegen dich sein würde: P
Oliver

4

Pyth, 22 Bytes

JU2VQ=+Js>2J)is.BM<JQ2

Probieren Sie es hier aus

Erläuterung

JU2VQ=+Js>2J)is.BM<JQ2
JU2                       Set J = [0, 1].
   VQ       )             <Input> times...
     =+Js>2J              ... add the last 2 elements of J and put that in J.
                  <JQ     Take the first <input> elements...
               .BM        ... convert each to binary...
              s           ... concatenate them...
             i       2    ... and convert back to decimal.




2

J, 36 Bytes

3 :'#.;<@#:"0]2}.(,{:+_2&{)^:y _1 1'

Erläuterung:

3 :'#.;<@#:"0]2}.(,{:+_2&{)^:y _1 1' | Explicit function
                 (,{:+_2&{)^:y _1 1  | Make n fibonacci numbers, with _1 1 leading
              2}.                    | Drop the _1 1
       <@#:"0]                       | Convert each item to binary and box
      ;                              | Unbox and join
    #.                               | Convert back from binary

2

x86, 37 22 21 Bytes

Änderungsprotokoll

  • -13 mit bsr. Vielen Dank, Peter Cordes!
  • -2 durch Nullstellen der Register mitmul .

  • -1 durch Verwenden einer while-Schleife anstelle von loopund push/ pop ecx(Kredit Peter Cordes).

Eingabe in edi, Ausgabe in edx.

.section .text
.globl main
main:
        mov     $5, %edi            # n = 5

start:
        dec     %edi                # Adjust loop count
        xor     %ebx, %ebx          # b = 0
        mul     %ebx                # a = result = 0
        inc     %ebx                # b = 1

fib:
        add     %ebx, %eax          # a += b
        xchg    %eax, %ebx          # swap a,b
        bsr     %eax, %ecx          # c = (bits of a) - 1
        inc     %ecx                # c += 1
        sal     %cl, %edx           # result >>= c
        add     %eax, %edx          # result += a

        dec     %edi                # n--; do while(n)
        jnz     fib 

        ret

Objektspeicherauszug:

00000005 <start>:
   5:   4f                      dec    %edi
   6:   31 db                   xor    %ebx,%ebx
   8:   f7 e3                   mul    %ebx
   a:   43                      inc    %ebx

0000000b <fib>:
   b:   01 d8                   add    %ebx,%eax
   d:   93                      xchg   %eax,%ebx
   e:   0f bd c8                bsr    %eax,%ecx
  11:   41                      inc    %ecx
  12:   d3 e2                   shl    %cl,%edx
  14:   01 c2                   add    %eax,%edx
  16:   4f                      dec    %edi
  17:   75 f2                   jne    b <fib>
  19:   c3                      ret    

1
Verwenden Sie leadiese Option, um fib2 zu verschieben und hinzuzufügen. Außerdem ist es nicht erforderlich, jedes Bit einzeln zu extrahieren. Verwenden Sie bsr %eax, %ecxdiese Option , um die Anzahl der Bits in der Binärdarstellung zu ermitteln, und verwenden Sie eine Verschiebung um CL / oder zum Zusammenführen, wie dies bei Dennis 'Python-Antwort der Fall ist.
Peter Cordes

1
Sie benötigen clfür Verschiebungszählungen, nehmen Sie also Ihren Schleifenzähler in eine andere Position (wie %edi) und verwenden Sie dec %edi / jnz(3 Bytes im 32-Bit-Code, 4 Bytes im 64-Bit-Code). Bei einem 32-Bit-Code erspart dies insgesamt 1 Byte beim Löschen der Push / Pop-ecx. Gehen Sie nicht in die Falle, loopwenn das Problem dadurch schwerer und nicht einfacher wird. (Ihre Aufrufkonvention ist bereits benutzerdefiniert, %ebxalso rufen Sie Ihre Funktion nicht auf. main) Möglicherweise können Sie in EAX zurückkehren, während Sie immer noch 1 Byte nutzen. xchgSie müssen nicht dem Standard entsprechen, wenn Sie dies nicht müssen.
Peter Cordes

1
Sie können die zusätzliche inc %ecxSchichtanzahl durch eine zusätzliche Linksverschiebung ersetzen , indem Sie verwenden lea (%eax, %edx, 2), %edx. Neutral in Bytes für 32-Bit, speichert eine für x86-64. Speichert aber eine Anweisung.
Peter Cordes

1
Jedes Mal, wenn ich loopCodegolf spiele, fühle ich mich schmutzig. Nun, nicht ganz, aber enttäuscht, dass ich keine ebenso kleine Implementierung finden konnte, die diese langsame Anweisung vermeidet; Außerhalb von Code Golf loopist einer meiner Lieblingstiere . Ich wünschte , es wäre auf modernen CPUs schnell, denn es wäre sehr schön für Schleifen mit erweiterter Genauigkeit ohne partielle Unterbrechungen, aber es ist keine und sollte nur als obskure Anweisung zur Größenoptimierung betrachtet werden, die Ihren Code langsam macht.
Peter Cordes

1
Wie auch immer, gute Arbeit. Abgesehen von push / pop / loop -> dec / jnz sehe ich keine Einsparungen, nur die LEA-Beschleunigung, die in der Codegröße neutral ist. Ich habe mich immer gefragt, ob es jemals einen echten Anwendungsfall für den xor/ multrick to zero three-Register gibt (brauchen Sie jemals so viele Nullen?), Aber das als Teil der Erstellung eines 1macht es sinnvoller.
Peter Cordes


2

Haskell , 89 76 75 Bytes

f=0:scanl(+)1f
foldr1(\x y->y+x*2*2^floor(logBase 2.read.show$y)).(`take`f)

Ungolfed-Version:

import Data.Bits

fib = 0:scanl (+) 1 fib

catInt :: Integer -> Integer -> Integer
catInt x y = x' + y where
    position = floor $ succ $ logBase 2 $ realToFrac y
    x' = shift x position

answer :: Integer -> Integer
answer n = foldr1 catInt fib' where
    fib' = take n fib

1
Willkommen bei PPCG und Haskell Golf im Besonderen! Eine kürzere Möglichkeit, eine unendliche Liste von Fibonacci-Zahlen zu generieren, ist f=0:scanl(+)1f(von hier übernommen ). Funktionen können anonym sein, so dass Sie die Führung löschen können g=, finden Sie in unserem Leitfaden für Ggolfing-Regeln in Haskell .
Laikoni

Vielen Dank! Dies kompensiert einige der längeren verwendeten Funktionen. Ich habe eine Weile lang versucht, einen Weg zu finden, um Bit-Shifting präziser zu implementieren, kam aber zu kurz.
user9549915

Sie können ersetzen $realToFrac ymit .read.show$yeinem für Byte
H.PWiz


1

APL + WIN, 55 Bytes

Fordert zur Eingabe einer Ganzzahl auf.

v←b←0 1⋄⍎∊(⎕-2)⍴⊂'v←v,c←+/¯2↑v⋄b←b,((1+⌊2⍟c)⍴2)⊤c⋄'⋄2⊥b

Die maximale Ganzzahlgenauigkeit von APL + WIN beträgt 17 und das Ganzzahllimit liegt in der Größenordnung von 10E300, daher beträgt die maximale Eingabenummer 55 und das Ergebnis lautet: 1.2492739026634838E300



1

Gelee , 6 Bytes

ḶÆḞBFḄ

Probieren Sie es online!

Wertebereich -> n- te ÆḞIbonacci-Zahl -> von Dez bis BDez -> FLatte -> von Inary bis Dez


Ich habe diese Sprache nicht verstanden, aber ich dachte, die Ausgabe ist nicht immer korrekt. ZB Eingabe 10und Sie erhalten eine 16024033463, es ist falsch (richtige Antwort ist 250375522).
Guoyang Qin



1

MATL , 21 Bytes

0li:"yy+]xx&h"@B]&hXB

Probieren Sie es online!

Erläuterung

0l        % Push 0, then 1 (initial terms of the Fibonacci sequence)
i:"       % Do n times, where n is the input
  yy+     %   Duplicate top two numbers and push their sum
  ]       % End
xx        % Delete the last two results. The stack now contains the
          % first n Fibonacci numbers, starting at 0
&h        % Concatenate all numbers into a row vector
"         % For each
  @       %   Push current number
  B       %   Convert to binary. Gives a vector of 0 and 1
]         % End
&h        % Concatenate all vectors into a row vector
XB        % Convert from binary to decimal. Implicitly display

1

J , 25 Bytes

2(#.;)<@#:@(1#.<:!|.)\@i.

Probieren Sie es online!

Erläuterung

2(#.;)<@#:@(1#.<:!|.)\@i.  Input: n
                       i.  Range [0, n)
                     \@    For each prefix
                  |.         Reverse
                 !           Binomial coefficient (vectorized)
               <:            Decrement
            1#.              Sum
        #:                   Convert to binary
      <                      Box
    ;                        Link. Join the contents in each box
2 #.                         Convert to decimal from base 2



1

PHP, 124 Bytes

Probieren Sie es online!

So war ich auf der Suche nach einer Möglichkeit zur Ausgabe von Fibonacci - Zahlen , die Serie verwenden, bis ich dies . Es hat sich herausgestellt, dass Sie die Fibonacci-Reihe durch Runden berechnen können. Deshalb habe ich die Herausforderung mit einer rekursiven Funktion versucht.

Ich fand den Ansatz des "Rundens" wirklich interessant, auch ein Professor hat mir das vor einiger Zeit gezeigt.

Code

function f($n,$i=0,$b=''){ if($n>$i){$b.=
decbin(round(pow((sqrt(5)+1)/2,$i)/sqrt(5)));f($n,$i+1,$b);}else{echo bindec($b);}}

Erläuterung

function f($n,$i=0,$b=''){           #the function starts with $i=0, our nth-fib number
if($n>$i){                           #it stops once $n (the input) = the nth-fib
    $b.=decbin(                      #decbin returns an integer as bin, concatenates
        round(pow((sqrt(5)+1)/2,$i)/sqrt(5))    
                                       #the formula, basically roundign the expression
        );                           #it returns the (in this case) $i-th fib-number   
    f($n,$i+1,$b);                   #function is called again for the next index
}else{                               #and the current string for fibonacci

    echo bindec($b);                 #"echo" the result, bindec returns the base 10
                                     #value of a base 2 number
}
}

Überprüfen Sie auch diesen Stackoverflow-Beitrag. Die beste Antwort bezieht sich auf denselben Artikel auf Wikipedia.


Interessante Art und Weise, es zu tun!
Nathan Wood



1

Pyth, 27 Bytes

JU2V-Q2=aJ+eJ@J_2)is.BM<JQ2

Testsuite

Python 3 Übersetzung:
Q=eval(input())
J=list(range(2))
for i in range(Q-2):
    J.append(J[-1]+J[-2])
print(int(''.join(map("{0:b}".format,J[:Q])),2))

37 Bytes

J[Z1)W<lJQ=aJ+eJ@J_2)Ig1QZ.?ijkm.BdJ2

Testsuite

Python 3 Übersetzung:
Q=eval(input())
J=[0,1]
while len(J)<Q:
    J.append(J[-1]+J[-2])
if 1>=Q:
    print(0)
else:
    print(int(''.join(map("{0:b}".format,J)),2))



0

Jotlin , 59 Bytes

g(l(0,1)){l(a.sum(),a[0])}.take(this).j(""){a[0].s(2)}.i(2)

Testprogramm

data class Test(val input: Int, val output: Long)

val tests = listOf(
    Test(1, 0),
    Test(2, 1),
    Test(3, 3),
    Test(4, 14),
    Test(5, 59),
    Test(6, 477),
    Test(7, 7640),
    Test(8, 122253),
    Test(9, 3912117),
    Test(10, 250375522)
)
fun Int.r() = g(l(0,1)){l(a.sum(),a[0])}.take(this).j(""){a[0].s(2)}.i(2)

fun main(args: Array<String>) {
    for (r in tests) {
        println("${r.input.r()} vs ${r.output}")
    }
}

Es werden bis zu 10 unterstützt, ein Wechsel .i(2)zu .toLong(2)würde bei Bedarf bis zu 14 unterstützen


0

Python 2, 88 Bytes

def f(n):
 a,b,r=0,1,"0"
 for _ in range(n-1):a,b=b,a+b;r+=bin(a)[2:]
 print int(r,2)

0

R , 244 180 179 Bytes

i=ifelse;g=function(n)i(n<3,1,g(n-1)+g(n-2))
a=scan(,"");i(a==1,0,sum(2^(which(rev(unlist(sapply(g(2:a-1),function(x)(y=rev(as.numeric(intToBits(x))))[which(!!y)[1]:32]))>0))-1)))

Probieren Sie es online!

Einige Bytes wurden durch Verketten von numerischen Vektoren und nicht von Zeichenfolgen gespeichert. Verdammter Sonderfall für 0!


Funktionen sind akzeptabel. Es ist auch viel effizienter, das Ergebnis um die Anzahl der Bits nach links zu verschieben, als sich mit numerischen Vektoren zu beschäftigen. Siehe meine oder Dennis 'Python-Antwort. Dies hat den zusätzlichen Vorteil, dass der Fall 0 behandelt wird.
Qwr


@qwr Die Antwort ist keine Funktion; Ich erstelle eine Hilfsfunktion, weil sie sapplyaufgrund der Tatsache, dass sie rekursiv ist, zu einem Vektor gehören muss . Es kann nicht alles in eine Zeile eingeschlossen werden. Wie Sie sehen, fordert das Programm den Benutzer zur Eingabe auf und gibt dann die Antwort zurück. Ein Byte kann durch Erstellen einer Verknüpfung für gespeichert werden ifelse. Und ... wir können entfernen ,""aus scan, ja.
Andreï Kostyrka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.