バイナリフィボナッチ


31

チャレンジ

正の整数Nを取り、2進数でフィボナッチ数列の最初のN項を計算し、それを1つの2進数に連結し、その数値を10進数に変換してから10進数として出力するプログラムまたは関数を生成する必要があります整数。

例えば

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

->、単に数値を出力する必要はありません(例えば、ユーザーが4、単にoutputと入力した場合14)。矢印は、プログラムが何をする必要があるかを説明するためのものです。

テストケース

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

プログラムは、使用中の言語の制限まで出力できる必要があります。ルックアップテーブルまたは一般的な回避策は許可されていません。

これはなので、バイト数が最も少ない答えが勝ちです!


1
tio.run/##DYxBCoQwDAC/…から0〜20のテストケースを追加しました。プログラムの@alephalphaの功績。
ネイサンウッド

6
まだ言われていないので、PPCGへようこそ!素敵な最初の挑戦。
ライコニ

@ライコニありがとう!
ネイサンウッド

言語固有の制限は正確にどこに適用されますか?32ビット整数を返すC関数は許可されますか?のようにint32_t binary_concat_Fib(int n)、結果の出力値を2 ^ 31-1に制限します。つまり、連結されたすべてのビットが整数に収まると仮定します。または、最大フィボナッチ数がそれ自体で整数に収まらない点まで機能する必要があるため、ビットの連結には拡張精度が必要ですか?
ピーター

1
また、「10進数に変換」は、整数->文字列関数を呼び出すか、自分で記述して明示的に行う必要がありますか?ビットを単一の整数に連結すると、最終値の表現が得られます。私が正しく理解していれば、デニスのPythonの答えは整数を返し、呼び出し側にその値を10進数の文字列に変換するか、それをどうするかを任せています。ビットシフト演算子をサポートするコンピューター言語の整数値は、文字列に格納されていない限り、10進数ではなく2進数です。シフト/ビット演算子のない言語では、ベースは何も意味しません。
ピーター

回答:



10

ゼリー 7  6 バイト

ḶÆḞBẎḄ

オンラインでお試しください!

どうやって?

ḶÆḞ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
新しいクイックをいじってみると、最初のn個のフィボナッチ数もṚc’SƲƤ同様のシーケンスに役立つ可能性があります。
マイル


7

brainfuck、397バイト

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

まあ、それは楽しかったです!

ASCII入力(例:)を11受け取り、結果をASCIIで出力します。

注:これをオンラインで試すには、セルサイズを32ビット(Webページの右側)に設定してください。入力を入力しないと、ブラウザがクラッシュする可能性があります。

インタープリターは1132ビットまでしかサポートしないため、それ以上の入力を処理できません。

copy.shで試してください

説明

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

10進入力を取得し、1を追加します(オフバイ1を軽減するため)

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

テープにフィボナッチ数を生成します。

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

着信バイナリ連結ループのセットアップ


したがって、セルには最初の位置から始まる値が含まれ、

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

これらのセルを見てください:

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

これにラベルを付けます:

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

pow厳密により大きい2の最大のべき乗を見つけるためにありますnumsumこれまでの数字の連結です。catは2の累乗で、前numに連結するために乗算する必要があります(したがって、単純に加算できます)。numsum


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

ループ:f_nが厳密により小さいかどうかを確認しpowます。

真実:

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

ジャンクをゼロにします。次に、num* catをに追加しsumます。次に、次のフィボナッチ数(= f_(n-1);存在しない場合はループを終了)をロードし、*に設定catcatますpow。次のループの準備をします(ジャンクをゼロにし、スコープを1つシフトします)。

偽:

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

pow2 * powに設定し、復元しnumます。

]

フィボナッチ数がなくなるまで繰り返します。


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

ゴミをきれいに。結果の数値の各桁を取り、それぞれを(ASCIIで)出力します。


7

、7バイト

ḋṁḋ↑Θİf

オンラインでお試しください!

説明

ḋṁḋ↑Θİ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へようこそ!:)
DJMcMayhem

5

Japt、9バイト

ÆMgX ¤Ã¬Í

それを実行します

説明:

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

1
ああ!それに私を打つ!
シャギー

1
@Shaggy私はこれがあなたとの競争になることを知っていました:P-
オリバー

4

Pyth、22バイト

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

ここで試してみてください

説明

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バイト

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

説明:

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バイト

変更履歴

  • -13を使用してbsr。ピーター・コーデスに感謝します!
  • -2でレジスタをゼロ化するmul

  • -1 whileループを使用しての代わりによるlooppush/ pop ecx(クレジットピーター・コルド)。

入力でedi、出力で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
使用leaFIB2でシフト加算します。また、各ビットを1つずつ抽出する必要はありません。bsr %eax, %ecxDennisのPythonの答えが行っているように、バイナリ表現のビット数を見つけ、CL /によるシフトを使用するか、マージするために使用します。
ピーター

1
clシフトカウントが必要なので、ループカウンターを別のreg(など%edi)に入れて使用しますdec %edi / jnz(32ビットコードで3バイト、64ビットで4バイト)。32ビットコードでは、プッシュ/ポップecxのドロップから合計1バイト節約できます。loop問題をより困難に、より簡単にするには、使用のtrapに陥らないでください。(あなたの呼び出し規約はすでにカスタムであり、破壊的です%ebx、あなたの関数を呼び出さないでくださいmain)あなたはまだ1バイトを利用しながらEAXに戻ることができるかもしれxchgません、あなたがする必要がない場合は非標準である必要はありません。
ピーター

1
を使用して、追加inc %ecxしたシフトカウントの余分な部分を余分な左シフトに置き換えることができますlea (%eax, %edx, 2), %edx。32ビットの場合はバイト単位でニュートラルで、x86-64の場合は節約されます。しかし、命令を保存します。
ピーター

1
最終的loopにコードゴルフで使用するたびに、私は汚い気分になります。まったくそうではありませんが、その遅い命令を回避する同等の小さな実装が見つからなかったことに失望しました。コードゴルフの外でloopは、私のペットのおしっこの一つです。私が望むことは、部分フラグ屋台のない拡張精度のループのための非常に素晴らしいだろうので、それは、現代のCPUに速かったが、それはないですし、ゆっくりとあなたのコードを作るあいまいなサイズの最適化命令としてのみ考慮されるべきです。
ピーター

1
とにかく、いい仕事だ。push / pop / loop-> dec / jnz以外は、節約は見られません。コードサイズに中立的なLEAの高速化だけです。3つのレジスタをゼロにするxor/ mulトリックの実際のユースケースがあるかどうかはいつも疑問に思っていましたが(多くのゼロが必要ですか?)、それをaの作成の一部として使用1することはより賢明です。
ピーター


2

Haskell89 76 75バイト

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

ゴルフされていないバージョン:

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
特にPPCGとHaskellゴルフへようこそ!フィボナッチ数の無限リストを生成するより短い方法はf=0:scanl(+)1fここから取られます)です。関数は匿名にすることができるため、先頭を削除できます。HaskellのGgolfingルールガイドをg=参照してください。
ライコニ

ありがとう!これは、使用されるより長い関数の一部を補います。私はビットシフトをより簡潔な方法で実装する方法を見つけようとしてしばらくを費やしましたが、不足していました。
user9549915

あなたは置き換えることができます$realToFrac y.read.show$y1バイトのために
H.PWiz


1

APL + WIN、55バイト

整数の画面入力のプロンプト。

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

APL + WINの最大整数精度は17であり、整数制限は10E300のオーダーです。したがって、最大入力数は55であり、結果は1.2492739026634838E300です。



1

ゼリー、6バイト

ḶÆḞBFḄ

オンラインでお試しください!

owered範囲- > N番目ÆḞibonacci数- > 12月からのBinary - > Flatten - >からinary 12月に


この言語は理解できませんでしたが、出力が常に正しいとは限りませんでした。たとえば、入力する10とが表示されますが16024033463、それは正しくありません(正解はです250375522)。
国陽



1

MATL, 21 bytes

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

Try it online!

Explanation

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.

Try it online!

Explanation

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

Try it online!

So I was looking for a way to output fibonacci numbers using the series, until I found this. It turns out you can calculate the fibonacci series via rounding, so I tried the challenge with a recursive function.

I found the approach of "rounding" really interesting, also a professor showed me this a while ago.

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

Explanation

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

Also check this stackoverflow post the best answer refers to the same article on Wikipedia.


Interesting way to do it!
Nathan Wood

1

Stax, 9 bytes

ü1∞╓♪εw≤+

Run and debug it at staxlang.xyz!

Unpacked (10 bytes) and explanation:

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 bytes

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

Test suite

Python 3 translation:
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

Test suite

Python 3 translation:
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)

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

It supports up to 10, changing .i(2) for .toLong(2) would support up to 14 if needed


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

Try it online!

Saved some bytes by concatenating numeric vectors, not strings. Bloody special case for 0!


Functions are acceptable. Also it is much more efficient to shift the result left by the number of bits then to bother with numeric vectors. See my or Dennis's python answer. This has the added benefit of handling the 0 case.
qwr


@qwr The answer is not a function; I am creating a helper function because it must be sapply’d to a vector due to the fact that it is recursive. It cannot be all wrapped into one line. As you see, the programme prompts for user’s input and then returns the answer. One byte can be saved by creating a shortcut for ifelse. And... we can remove ,"" from scan, yes.
Andreï Kostyrka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.