İkili Fibonacci


31

Meydan okuma

Olumlu bir tamsayı alan, Fibonacci dizisinin ilk N terimlerini ikili olarak alan, tek bir ikili sayıya birleştiren, bu sayıyı ondalık basamağa dönüştüren ve ardından ondalık olarak basılan bir program ya da işlev oluşturmanız gerekir. tamsayı.

Örneğin

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

->Sadece sayıyı çıkarmanız gerekmez (örneğin, kullanıcı yazıyorsa 4, çıktı 14). Oklar sadece programın ne yapması gerektiğini açıklamaya yardımcı olmak içindir.

Test durumları

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

Program, kullanılan dil sınırına kadar çıktı verebilmelidir. Arama tablolarına veya ortak geçici çözümlere izin verilmez.

Bu , yani en kısa bayt sayısına sahip olan cevap kazanır!


1
Tio.run/##DYxBCoQwDAC/… ' den 0 ila 20 test vakası eklendi . Program için @ alephalpha'ya teşekkür ederiz.
Nathan Wood,

6
Henüz söylenmediği gibi: PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma.
Laikoni

@Likonik Teşekkürler!
Nathan Wood

Dile özgü sınır tam olarak nerede geçerlidir? 32 bit tam sayı döndüren bir C işlevine izin verilir mi? Gibi int32_t binary_concat_Fib(int n), elde edilen çıkış değeri 2 ^ 31-1 ile sınırlandırılır. yani birleştirilmiş tüm bitlerin bir tamsayıya uyduğunu varsayıyorsunuz. Yoksa işlev, en büyük Fibonacci sayısının kendi başına bir tamsayıya uymadığı noktaya kadar mı çalışmalı, bu yüzden bitleri birleştirmek hassasiyeti arttırıyor mu?
Peter Cordes

1
Ve "ondalık değere dönüştürür" ifadesinin açık olması, tamsayı-> string işlevini çağırmak mı yoksa kendiniz yazmak mı? Bitleri tek bir tamsayıda birleştirmek, nihai değerin bir gösterimini verir. Doğru anlarsam, Dennis'in Python cevabı bir tamsayı döndürerek, bu değeri bir ondalık dizgiye dönüştürmek ya da onunla ne yapmaksa onu arayana bırakıyor. Bit kaydırma operatörlerini destekleyen bilgisayar dillerinde tamsayı değerleri, dizelerde depolanmadıkça, ondalık değil doğal olarak ikilidir. Vardiya / bit operatörleri olmayan dillerde hiçbir şey herhangi bir temel anlamına gelmez.
Peter Cordes

Yanıtlar:



10

Jöle ,  7  6 bayt

ḶÆḞBẎḄ

Çevrimiçi deneyin!

Nasıl?

ḶÆḞ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
Yeni çabukluklarla uğraşırken, ilk n Fibonacci sayılarının da Ṛc’SƲƤbenzer diziler için faydalı olabilecekleri kullanarak bulunabileceğini öğrendim .
miller


7

brainfuck , 397 bayt

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

Bu eğlenceliydi!

ASCII girişini (örn. 11) Alır , çıkışlar ASCII ile sonuçlanır.

Not: Bunu çevrimiçi denemek için, hücre boyutunu 32 bit olarak ayarladığınızdan emin olun (web sayfasının sağ tarafında). Bir giriş girmezseniz, tarayıcınız çökebilir.

Tercüman girişi 11ve üstünü kaldıramaz çünkü yalnızca 32 bit destekler.

Copy.sh üzerinde deneyin

açıklama

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

Ondalık giriş elde edin ve bir tane ekleyin (tek tek azaltmak için)

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

Kasette fibonacci sayıları oluşturun.

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

Gelen ikili birleştirme döngüsüne ayarlayın


Böylece hücreler ilk pozisyondan başlayarak değeri içerirler.

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

Şu hücrelere bak:

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

Bunu etiketleyeceğim:

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

powkesinlikle 2 den büyük olan gücü bulmak için orada num. sumşimdiye kadar sayıların birleştirilmesidir. önünde birleşmek için çarpmam catgereken 2'nin gücü (bu yüzden basitçe ekleyebilecektim).numnumsum


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

Döngü: f_nKesinlikle kesinlikle daha az olup olmadığını kontrol edin pow.

Truthy:

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

Önemsiz sıfır. Ardından eklemek num* catiçin sum. Daha sonra, bir sonraki Fibonacci sayıda yük (= f_(n-1); eğer olursa, çıkış döngü var olmayan) ve seti catiçin cat* pow. Bir sonraki döngü için hazırlanın (daha fazla önemsiz sıfırlayın, kapsamı birer kaydırın).

Falsey:

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

pow2 * olarak ayarlayın pow, geri yükleyin num.

]

Fibonacci numarası kalmayana kadar tekrarlayın.


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

Çöpleri temizle. Elde edilen sayının her basamağını alın ve her birini (ascii olarak) girin.


7

Kabuğu , 7 bayt

ḋṁḋ↑Θİf

Çevrimiçi deneyin!

açıklama

ḋṁḋ↑Θİ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

PPCG'ye Hoşgeldiniz! :)
DJMcMayhem

5

Japt , 9 bayt

ÆMgX ¤Ã¬Í

Koş

Açıklama:

Æ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! Beni yen!
Shaggy

1
@Shaggy Bunun sana karşı yarışacağını biliyordum: P
Oliver

4

Pyth, 22 bayt

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

Burada dene

açıklama

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.

3

Perl 6 , 38 bayt

{:2([~] (0,1,*+*...*)[^$_]>>.base(2))}

Çevrimiçi deneyin!


1
Not Bu başlar 200'ün üzerindedir girişler ile gözle görülür bir azalma almak için o O (yazdırmadan eklerseniz 20 saniye) 1000 bir girişi olan çıktıyı üretmek için 8 hakkında saniye sürer
Brad Gilbert b2gills



2

J, 36 Bayt

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

Açıklama:

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 bayt

Değişiklikler

Giriş girişi edi, çıkış girişi 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

objdump:

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
Kullanım leafib2 vardiyalı ve-eklenti için. Ayrıca, her bir biti bir defada çıkarmak gereksizdir. bsr %eax, %ecxİkili gösterimlerdeki bit sayısını bulmak için kullanın ve Dennis'in Python yanıtı gibi CL / veya birleştirmek için bir kayma kullanın.
Peter Cordes

1
clVardiya sayımı yapmanız gerekiyor , bu yüzden loop sayacınızı farklı bir reg (like %edi) içine alın ve kullanın dec %edi / jnz(32 bit kodunda 3 bayt, 64 bit'te 4 bayt). 32-bit kodda, push / pop ecx'i düşürmekten toplam 1 bayt tasarruf sağlar. loopSorunu daha da zorlaştırdığında kullanma tuzağına düşmeyin , kolay değil. (Arama kurallarınız özel, gizlilik %ebx, bu nedenle işlevinizi arama main) EAX'e yine 1 byte'tan yararlanırken dönebilirsiniz xchg, gerekmediğinde standart olmanıza gerek kalmaz.
Peter Cordes

1
Sen ekstra yerini alabilecek inc %ecxEklemek olarak kullanarak, extra sol vardiya ile vardiya sayımı lea (%eax, %edx, 2), %edx. 32-bit için bayt cinsinden boş, x86-64 için bir tane kaydeder. Ancak bir talimatı kaydeder.
Peter Cordes

1
Ne zaman loopkod golf kullanmaya başlasam, kendimi kirli hissediyorum. Tam olarak değil, ama bu yavaş öğretimi önleyen eşit derecede küçük bir uygulama bulamadığım için hayal kırıklığına uğrattım; kod golf dışında, loopevcil hayvanlarımdan biri . Ben diliyorum kısmi bayraklı tezgahları olmadan genişletilmiş doğruluğu döngüler için çok güzel olurdu çünkü modern CPU'lar üzerinde hızlıydı, ama değil ve yavaş kodunuzu yapar bilinmeyen bir boyut optimizasyonu talimat olarak yalnızca düşünülmelidir.
Peter Cordes

1
Neyse, iyi iş çıkardın. Push / pop / loop -> dec / jnz dışında, herhangi bir tasarruf göremiyorum, yalnızca kod boyutunda nötr olan LEA hızlandırması var. Hep için gerçek bir kullanım durumu hiç olmadığını merak ediyorum xor/ mulhile sıfır üç kayıtları (Bunu hiç birçok sıfır gerekiyor?), Ama oluşturmanın bir parçası olarak bir o kullanarak 1daha mantıklı hale getirir.
Peter Cordes


2

Haskell , 89 76 75 bayt

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

Ungolfed versiyonu:

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
Özellikle PPCG ve Haskell golf oynamalarına hoş geldiniz! Sonsuz bir Fibonacci sayıları listesi oluşturmanın daha kısa bir yolu f=0:scanl(+)1f( buradan alınır ). İşlevler anonim olabilir, bu yüzden öncüyü bırakabilirsiniz, Haskell'deki Ggolfing Kuralları Rehberimizeg= bakın .
Laikoni,

Teşekkürler! Bu, kullanılan daha uzun fonksiyonlardan bazılarını telafi eder. Biraz zaman kayması uygulamak için daha kısa bir yol bulmaya çalışırken çok kısa sürdüm.
user9549915

Sen yerini alabilir $realToFrac yile .read.show$ybir byte için
H.PWiz


1

APL + WIN, 55 bayt

Tamsayı ekran girişi için ister.

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

APL + WIN'in maksimum tamsayı hassasiyeti 17'dir ve tamsayı sınırı 10E300 derecesindedir, bu nedenle maksimum giriş sayısı 55'tir ve sonuç: 1.2492739026634838E300



1

Jöle , 6 bayt

ḶÆḞBFḄ

Çevrimiçi deneyin!

owered aralığı -> n inci ÆḞ> dec göre - ibonacci sayısı Binary -> Flatten -> den inary dec için


Bu dili anlamadım ama çıktının her zaman doğru olmadığını düşündüm. örn. Girdi 10ve bir alırsınız 16024033463, bu yanlış (doğru cevap 250375522).
Guoyang Qin,



1

MATL , 21 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

açıklama

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 Bayt

Çevrimiçi deneyin!

Ben bulana kadar Yani, dizi kullanarak çıkış Fibonacci sayıları için bir yol arıyordu bu . Görünüşe göre fibonacci serisini yuvarlama yoluyla hesaplayabilirsiniz, bu yüzden özyinelemeli bir fonksiyonla mücadeleyi denedim.

"Yuvarlama" yaklaşımını ilginç buldum, ayrıca bir süre önce bir profesör de gösterdi.

kod

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);}}

açıklama

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
}
}

Ayrıca bu yığın akışını kontrol edin ve en iyi yanıt Wikipedia'daki aynı makaleye işaret eder.


Bunu yapmak için ilginç bir yol!
Nathan Wood,

1

Stax , 9 bayt

ü1∞╓♪εw≤+

Koşun ve staxlang.xyz de hata ayıklayın!

Ambalajsız (10 bayt) ve açıklama:

vr{|5|Bm|B
v             Decrement integer from input. Stax's Fibonacci sequence starts with 1 :(
 r            Integer range [0..n).
  {    m      Map a block over each value in an array.
   |5           Push nth Fibonacci number.
     |B         Convert to binary.
        |B    Implicit concatenate. Convert from binary. Implicit print.


1

Pyth, 27 bayt

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

Test odası

Python 3 çeviri:
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 bayt

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

Test odası

Python 3 çeviri:
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 bayt

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

Test programı

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}")
    }
}

Değişen 10'a kadar destekler .i(2)için .toLong(2)gerekirse 14 kadar destek vereceğini


0

Python 2,8 bayt

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 bayt

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)))

Çevrimiçi deneyin!

Dizeleri değil, sayısal vektörleri birleştirerek bazı baytlar kaydedildi. 0 için kanlı özel durum!


İşlevler kabul edilebilir. Ayrıca, sayının bit sayısıyla bırakılması ve ardından sayısal vektörlerle rahatsız edilmesi çok daha etkilidir. Bakın ya da Dennis'in python cevabını görün. Bu, 0 olayı ele almanın yararına da sahiptir.
qwr


@ qwr Cevap bir fonksiyon değildir; Bir yardımcı işlev oluşturuyorum çünkü sapplyözyinelemeli olması nedeniyle bir vektöre göre olması gerekiyor. Hepsi tek bir satıra sarılamaz. Gördüğünüz gibi, program kullanıcının girişini ister ve ardından cevabı döndürür. Kısayol oluşturularak bir bayt kaydedilebilir ifelse. Ve ... çıkarabiliriz ,""dan scanevet.
Andreï Kostyrka
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.