교류 전력 피보나치 시퀀스


24

정의

교류 전력 피보나치 시퀀스는 다음과 같이 구성됩니다.

  1. 빈 시퀀스로 시작하여 n1로 설정하십시오 .

  2. 계산 F , NN 번째 음수 피보나치 수 번 반복.
    0 은 첫 번째, 1 은 두 번째 및 세 번째, 2 는 네 번째입니다. 다른 모든 것은 시퀀스에서 두 개의 이전 숫자를 합산하여 얻으므로 3 = 1 + 2 는 다섯 번째, 5 = 2 + 3 은 여섯 번째 등입니다.

  3. 경우 n은 홀수의 기호 변화 F N을 .

  4. 시퀀스 에 f n2 n-1 사본을 추가 합니다.

  5. n을 증가 시키고 2 단계로 돌아갑니다.

이들은 APF 시퀀스의 처음 100 개의 용어입니다.

 0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8

태스크

양의 정수 n 을 입력 으로 사용하고 APF 시퀀스 의 n 번째 항을 인쇄하거나 반환 하는 전체 프로그램 또는 함수를 작성하십시오 .

0 기반 색인 작성을 선호하는 경우, 음수가 아닌 정수 n을 취하여 색인 n 에서 APF 번호를 인쇄하거나 리턴 할 수 있습니다.

이것은 . 바이트 단위의 가장 짧은 코드가 이길 수 있습니다!

테스트 사례 (1 기반)

    1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610

테스트 사례 (0 기반)

    0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610

n에 대한 제약이 있습니까?
Okx

2
알고리즘이 임의로 큰 n 값에 대해 작동하는 한 데이터 유형에 적합하다고 가정 할 수 있습니다.
데니스

1
OEIS 번호가 있습니까?
Mindwin

@Mindwin 그렇지 않습니다.
Dennis 17

답변:


12

젤리 , 5 바이트

BLCÆḞ

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

방법?

피보나치 계열을 음의 지수로 다시 확장하여 관계가 f(i) = f(i-2) + f(i-1)계속 유지되도록합니다.

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

i=0숫자 에서 되돌아 가면 우리는 2 n-1 번 반복해야 하며 Jelly의 피보나치가 내장되어 ÆḞ있습니다.

-i비트 길이를 n빼고 빼서 필요한 (양수)를 찾을 수 있습니다 1.

우리가 원하기 때문에 i(음 번호)를 우리가 대신 수행 할 수 있습니다 1-bitLength와 젤리에 대한 원자있다 1-x, C, 보수 모나드를.

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

나는이 짧은 방법이었다하지만 그만큼, 그것은 7 제거하는 방법과 바이트 줄 알았는데 알고 µ
마일

너의 반복되는 부정은 영리했다. 나는 마이너스 1의 거듭 제곱을보고 있었고, 그것은 마이너스 피보나치 값에 대해 기억하고 젤리의 모나드에 꽂을 때까지 몇 바이트를 더합니다.
Jonathan Allan

4
솔직히, Jelly가 이진 길이를 얻기 위해 1 바이트가 내장되어 있지 않은 것에 놀랐습니다.
ETHproductions

22

파이썬 2 , 30 바이트

f=lambda n:n<1or f(n/4)-f(n/2)

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

하나의 색인.

시퀀스는 퍼즐처럼 느껴졌다. Dennis는 퍼즐을 표현할 수있는 짧은 방법으로 생성했다. 2의 거듭 제곱 반복은 비트 이동 (2로 나누기)에 의한 재귀를 제안합니다. 대체 부호 피보나치 재귀 f(n)=f(n-2)-f(n-1)는 감소 대신 비트 시프트에 적응 될 수있다. 기본 사례는 모든 것이 유입되기 때문에 잘 작동합니다 n=0.


6

매스 매 티카, 43 36 24 바이트

Fibonacci@-Floor@Log2@#&

@GregMartin 덕분에 7 바이트가 절약되었으며 @JungHwanMin 덕분에 12 바이트가 추가로 절약되었습니다.


1
을 사용 Floor@Log2@#하여 쓰거나 Fibonacci[t=...]마지막 지수에서 공백을 제거하여 몇 바이트를 저장할 수 있습니다 .
Greg Martin

1
-12 바이트 : Fibonacci@-Floor@Log2@#&- Fibonacci부정적인 인수도 취할 수 있습니다 (기호를 처리합니다).
JungHwan Min

5

MATL , 19 17 16 11 바이트

lOiB"yy-]x&

입력은 1 기반입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

1 - 기반 입력을 위해 N ,하자 m은 이진 확장의 자릿수 수 없음 . N 출력 시퀀스 번째 항은이다 m , 부호가 변경 가능하게하여, 피보나치 시퀀스 번째 용어.

한 가지 아이디어는 피보나치 시퀀스의 항을 계산하기 위해 m 번 반복하는 것 입니다. for each이진수 배열을 사용하여 루프를 사용하면 쉽습니다 . 피보나치 시퀀스와 initiallized된다면 01 평소처럼 순회가 있어요 배 초래 m + 2 개 가기 있도록 두 숫자는 삭제되어야 할 것이며, 스택의 이용. 대신 1 , 0으로 초기화 합니다. 이렇게하면 다음에 생성되는 용어는 1 , 1 , 2 , ...이며 한 번의 삭제 만 필요합니다.

부호는 m 루프를 변경하기 위해 다른 루프를 사용하여 처리 할 수 ​​있습니다 . 그러나 비용이 많이 듭니다. 피보나치 반복을 추가하는 대신 빼기 만하면되는 두 개의 루프를 통합하는 것이 좋습니다 .

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack



3

젤리 , 9 바이트

BLµ’ÆḞN⁸¡

하나의 기반 인덱싱을 사용합니다.

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

설명

이 방법은 피보나치 함수가 음이 아닌 인수 만 지원하는 경우 작동합니다.

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt , 6 바이트

Mg1-¢l

온라인으로 테스트하십시오!

작동 원리

다른 답변에서 언급 한 바와 같이, N 번째 교류 서명 피보나치 시리즈 기간은 동일하다 -n 번째 정규 시리즈의 용어입니다. n 은 입력의 비트 길이를 빼고 1을 빼서 찾을 수 있습니다. 이것을 부정하면 1에서 비트 길이를 뺀 값이됩니다.

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E , 11 10 바이트

1 기반 인덱싱 사용

05AB1E 의 피보나치 함수는 n 보다 작은 양의 fib 숫자를 반환합니다 . 즉, 필요한 것보다 더 많이 생성하고 인덱스별로 올바른 숫자를 얻은 다음 부호를 계산해야합니다. 따라서 그 주위에있는 방법이 반복적으로 숫자를 계산하는 것보다 짧을 것입니다.

Luis Mendo의 MATL answer에 설명 된대로 스택을 1, 0역으로 초기화 하여 사례를 처리 할 수 있다는 실현을 사용합니다 .n=1

XÎbgG‚D«`-

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

설명

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

펄 6 , 53 바이트

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

설명 된 방식으로 시퀀스를 간단하게 구현합니다.
제로 기반.


2

줄리아 0.5 , 19 바이트

!n=n<1||!(n/=4)-!2n

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

작동 원리

이것은 @ xnor 's Python answer 와 동일한 공식을 사용합니다 . 재발 관계
g (n) = g (n-2) + g (n-1) 은 피보나치 수열의 음수 항을 생성하며, 양수 항은 교호 부호와 동일합니다. 의 실행에 어느 곳에서 2 케이 같은 수의 반복, 우리의 이전 실행의 반복을 선택할 수 있습니다 K-1 숫자와의 실행 K-2 에 의해 인덱스를 나누어 그 전에 숫자를 24 .

간단하지 않고

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

목적에 따라 연산자를 재정의 할 수 있습니다. 또한 f 는 수레와 마찬가지로 잘 작동하므로

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

마지막으로 n4 로 나누면 n 을 업데이트하면 w / 22n 으로 쓰고 한 쌍의 괄호를 생략 하여이 답변에서 19 바이트 함수 정의로 이어질 수 있습니다.


1

J , 18 바이트

(%>:-*:)t.@<:@#@#:

하나의 기반 인덱싱을 사용합니다. 입력 정수 n > 0을 가져와 floor(log2(n))이진 표현의 길이를 찾아 계산 한 다음 해당 값을 1 씩 줄입니다. 그런 다음, 발견 floor(log2(n))-1번째 상기 생성 함수의 계수 (X) / (1 + X - X 2 ) 네거티브 피보나치 인덱스 값의 GF 인.

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

설명

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.