이진 피보나치


31

도전

양의 정수 N을 취하고 피보나치 시퀀스의 첫 번째 N 항을 이진수로 계산하여 단일 이진수로 연결 한 다음 해당 숫자를 다시 십진수로 변환 한 다음 십진수를 정수.

예를 들어

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입력하면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의 공로.
Nathan Wood

6
아직 말하지 않았 듯이 PPCG에 오신 것을 환영합니다! 좋은 첫 번째 도전.
Laikoni

@Laikoni 감사합니다!
Nathan Wood

언어 별 제한이 정확히 어디에 적용됩니까? 32 비트 정수를 반환하는 C 함수가 허용됩니까? 추천 int32_t binary_concat_Fib(int n)2 ^ 31-1에 결과 출력 값을 제한하는 것이다. 즉, 모든 연결된 비트가 정수에 적합하다고 가정합니다. 아니면 가장 큰 피보나치 수가 자체적으로 정수에 맞지 않는 지점까지 함수가 작동해야하므로 비트를 연결하면 확장 정밀도가 필요합니까?
Peter Cordes

1
그리고 "10 진수로 변환"은 정수-> 문자열 함수를 호출하거나 직접 작성해야합니까? 비트를 단일 정수로 연결하면 최종 값을 나타냅니다. 내가 올바르게 이해하면 Dennis의 Python 답변은 정수를 반환하여 호출자에게 그 값을 10 진수 문자열로 바꾸거나 무엇이든 할 수 있습니다. 비트 시프트 연산자를 지원하는 컴퓨터 언어의 정수 값은 문자열에 저장되지 않는 한 자연스럽게 10 진수가 아닌 2 진입니다. 쉬프트 / 비트 연산자가없는 언어에서는 어떤 기본도 암시하지 않습니다.
Peter Cordes

답변:



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
새로운 quicks와 장난, 내가 처음 발견 N 피보나치 숫자는 사용하여 찾을 수 있습니다 Ṛc’SƲƤ유사한 시퀀스에 유용 할 수있다.
마일


7

brainfuck , 397 바이트

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

글쎄, 재미 있었다!

ASCII 입력을받습니다 (예 : 11 결과를 ASCII로 출력합니다.

참고 : 온라인으로이 기능을 사용하려면 셀 크기를 32 비트 (웹 페이지 오른쪽)로 설정해야합니다. 입력을 입력하지 않으면 브라우저가 중단 될 수 있습니다.

인터프리터 11는 최대 32 비트 만 지원하므로 더 높은 입력을 처리 할 수 ​​없습니다 .

copy.sh에서 사용해보십시오

설명

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

십진수 입력을 얻고 하나를 추가하십시오 (일대일 완화).

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

테이프에 피보나치 수를 생성하십시오.

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

들어오는 이진 연결 루프 설정


셀은 첫 번째 위치부터 값을 포함합니다.

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의 최대 거듭 제곱을 찾을 수 있습니까 num? sum지금까지 숫자의 연결입니다. 앞에 2 를 연결하기 위해 cat곱 해야하는 2의 거듭 제곱입니다 (따라서 간단히 추가 할 수 있습니다).numnumsum


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

루프 : f_n미만 인지 확인하십시오 pow.

진실한 :

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

정크 제로. 그런 다음 num* cat를에 추가하십시오 sum. 다음에, 다음로드 피보나치 수 (=를 f_(n-1)그것은 않으면 종료 루프가 존재하지 않음) 세트 catcat* pow. 다음 루프를 준비하십시오 (더 많은 정크를 제거하고 범위를 하나씩 이동).

팔시 :

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

pow2 *로 설정 하고 pow복원하십시오 num.

]

피보나치 번호가 남지 않을 때까지 반복하십시오.


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

쓰레기를 청소하십시오. 결과 숫자의 각 숫자를 가져 와서 각 (아스키)로 출력하십시오.


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
Oliver

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. Peter Cordes에게 감사합니다!
  • 레지스터를 제로화하여 -2mul .

  • looppush/ pop ecx(신용 Peter Cordes) 대신 while 루프를 사용하여 -1

입력 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

오보 펌프 :

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의 변화 및-추가 할 수 있습니다. 또한 한 번에 하나씩 각 비트를 추출 할 필요가 없습니다. 사용 bsr %eax, %ecx이진 표현의 비트 수를 찾기 위해, 그리고 CL로의 전환을 사용 / 또는 병합에, 데니스의 파이썬 대답 같이하고있다.
Peter Cordes

1
당신은 필요 cl그래서 다른 (같은 등록에 루프 카운터를 타고 이동 카운트를 위해 %edi) 사용 dec %edi / jnz(32 비트 코드에서 3 바이트, 64 비트에서 4 바이트). 32 비트 코드에서는 푸시 / 팝 ecx를 삭제하여 총 1 바이트를 절약합니다. loop문제를 더 어렵게 만들 때 쉽게 사용할 수 있는 함정에 빠지지 마십시오 . (당신의 호출 규칙은 이미 사용자 정의, clobbering %ebx이므로 함수를 호출하지 마십시오. main) 1 바이트를 계속 사용하면서 EAX로 돌아올 수 있습니다 xchg. 필요하지 않은 경우 비표준이 아니어도됩니다.
Peter Cordes

1
을 사용하여 추가 inc %ecx시프트 시프트 수를 추가 할 때 추가 왼쪽 시프트로 교체 할 수 있습니다 lea (%eax, %edx, 2), %edx. 32 비트의 경우 바이트 단위의 중립으로, x86-64의 경우 1을 저장합니다. 그러나 명령을 저장합니다.
Peter Cordes

1
loop코드 골프를 사용할 때마다 더러워집니다. 글쎄요, 그러나 느린 명령을 피하는 똑같이 작은 구현을 찾을 수 없다는 것에 실망했습니다. 코드 골프 밖에서 loop내 애완 동물 친구 중 하나입니다 . 내가 소원 이 부분 플래그 포장 마차없이 확장 정밀도 루프에 대한 아주 좋은 것입니다 있기 때문에, 현대의 CPU에서 빨리, 그러나 그것은 아니다 느린 코드를 만드는 애매한 크기 최적화 명령으로 만 고려되어야한다.
Peter Cordes

1
어쨌든 잘 했어 push / pop / loop-> dec / jnz 외에 코드 크기가 중립 인 LEA 속도 향상 만 절약 할 수는 없습니다. 나는 항상 3 개의 레지스터를 0으로 만드는 xor/ mul트릭에 대한 실제 사용 사례가 있는지 궁금해 했지만 (많은 0이 필요합니까?)하지만 1그것을 만드는 것이 더 합리적입니다.
Peter Cordes


2

하스켈 , 89 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= 참조하십시오 .
Laikoni

감사! 사용 된 더 긴 기능 중 일부를 보완합니다. 비트 쉬프팅을보다 간결한 방식으로 구현하는 방법을 찾으려고 잠시 시간을 보냈지 만 짧았습니다.
user9549915

당신은 대체 할 수 $realToFrac y와 함께 .read.show$y한 바이트를 위해
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 번째 ÆḞ> 12월 내지 - ibonacci 번호 Binary -> Flatten ->에서 inary 12월 행


이 언어를 이해하지 못했지만 출력이 항상 정확하지는 않다고 생각했습니다. 예를 들어 입력 10하면을 얻을 수 있습니다 16024033463(정답은입니다 250375522).
Guoyang Qin



1

MATL , 21 바이트

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

온라인으로 사용해보십시오!

설명

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 바이트

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

온라인으로 사용해보십시오!

설명

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 바이트

온라인으로 사용해보십시오!

내가 찾은 때까지이 시리즈를 사용하여 출력 피보나치 수있는 방법을 찾고 있었다 그래서 . 반올림을 통해 피보나치 시리즈를 계산할 수 있으므로 재귀 함수로 도전을 시도했습니다.

나는 "반올림"의 접근 방식이 정말 흥미 롭다는 것을 알았고, 교수님도 얼마 전에 이것을 보여주었습니다.

암호

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

설명

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

또한 답변은 Wikipedia의 동일한 기사를 참조하십시오.


재미있는 방법!
Nathan Wood



1

Pyth, 27 바이트

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

테스트 스위트

파이썬 3 번역 :
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 바이트

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

테스트 스위트

파이썬 3 번역 :
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 바이트

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

테스트 프로그램

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

그것은 변화, 최대 10 개까지 지원 .i(2)을 위해 .toLong(2)필요한 경우 (14)를 지원할 것


0

파이썬 2, 88 바이트

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 바이트

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

온라인으로 사용해보십시오!

문자열이 아닌 숫자 형 벡터를 연결하여 일부 바이트를 절약했습니다. 피의 특별한 경우 0!


기능이 허용됩니다. 또한 결과를 비트 수만큼 왼쪽으로 이동 한 다음 숫자 형 벡터로 귀찮게하는 것이 훨씬 효율적입니다. 내 또는 Dennis의 파이썬 답변을 참조하십시오. 이것은 0 사례를 처리하는 추가 이점이 있습니다.
qwr


@qwr 답은 함수가 아닙니다. 나는 sapply재귀 적이라는 사실 때문에 벡터로 보내야하기 때문에 도우미 함수를 만들고 있습니다 . 한 줄로 모두 감쌀 수는 없습니다. 보시다시피, 프로그램은 사용자 입력을 요구하고 응답을 반환합니다. 에 대한 바로 가기를 만들어 1 바이트를 저장할 수 있습니다 ifelse. 그리고 ... ,""에서 제거 할 수 있습니다 scan.
Andreï Kostyrka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.