피보나치 수열의 선형 보간


20

당신의 임무는 n 번째 피보나치 수 를 찾는 것이지만, n 은 반드시 정수일 필요는 없습니다.

인덱스가 0 인 피보나치 시퀀스는 다음과 같습니다.

0, 1, 2, 3, 4, 5,  6,  7, ...

1, 1, 2, 3, 5, 8, 13, 21, ...

그러나 2,4 번째 숫자를 원하면 어떻게됩니까 ?

2.4 번째 숫자는 0.4 배 (3) 사이의 차이이다 RD 2 피보나치 수 더하기 2 피보나치 수. 따라서 2.4 번째 피보나치 수는 2 + 0.4 * (3 – 2) = 2.4입니다.

마찬가지로 6.35 번째 피보나치 수는 13 + 0.35 * (21 – 13) = 15.8입니다.

당신의 임무는 n 이 0보다 크거나 같은 n 번째 피보나치 수 를 찾는 것입니다.

이 인덱스를 0 또는 1로 지정할 수 있습니다. 사용중인 것을 말하십시오.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

몇 가지 예 :

0        1
4.5    6.5
0.7      1
7       21

2
여기서하는 작업을 "선형 보간"이라고합니다. (그것을 반영하기 위해 게시물의 제목을 변경해도 괜찮습니까?) 피보나치 속성이 f (n-2) + f (n-1) = f (n) 인 것 같습니다. 피보나치 서열의 합리적인 일반화. (표준 일반화가 있는지 확실하지 않습니다.)

@ ais523, 질문을 개선한다고 생각되면 게시물 제목을 변경할 수 있습니다.
다니엘

누군가가 비슷한 것을 물으면 나중에 질문을 더 쉽게 찾을 수있을 것이며, "관련"목록과 같은 내용을 명확하게 해줄 것이라고 생각합니다. 따라서 응답자가 올바른 장소로 이동할 수 있도록 도와줌으로써 질문을 개선 할 수 있습니다.

2
@ais Binet 공식의 일반화가있는 것 같습니다 : mathworld.wolfram.com/FibonacciNumber.html
Neil

1
코드 골프가 요청을 정당화 할 필요는 없지만 (추상 한) 이상한 동작처럼 보입니다. 그것에 따라, F_0 = 0그리고 이후 로 F_2 = 1, 우리는해야 F_1 = (1/2)(F_0 + F_2) = 1/2합니다.
LSpice

답변:


7

젤리 , 5 바이트

_Ḟ1+¡

이것은 내장되지 않은 반복 솔루션입니다. 챌린지 사양과 동일한 인덱싱을 사용합니다.

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

배경

하자 f는 챌린지 및 스펙에 정의 된 함수가 될 F (즉, 함께, 일반적인 정의 피보나치 함수 F (0) = 0 ). 음이 아닌 정수 n의 경우 f (n) = F (n + 1) 입니다. 경우 0 ≤ X <1 , 챌린지 사양 정의 F (N + X) 로서 F (N) + (F (N + 1) - F (N)) × .

분명히 이것은 기본 사례에만 영향을 주지만 재귀 공식에는 영향을 미치지 않습니다. 즉 f (n) = f (n-1) + f (n-2)F에서 와 같이 유지됩니다 . 이는 정수가 아닌 인수에 대한 정의를 더 쉬운 f (n) = f (n) + f (n-1) x로 단순화 할 수 있음을 의미 합니다.

다른 사람들이 답변에서 언급했듯이 재귀 관계는 정수가 아닌 인수에도 적용됩니다. 이것은 쉽게 확인할 수 있습니다.

proof

이후 F (0) = F (1) = 1 , F 구간에서 상수 [0, 1]F (X + 0) = 1 모든 X . 또한 f (-1) = F (0) = 0 이므로 f (-1 + x) = f (-1) + (f (0)-f (-1)) x = 0 + 1x = x 입니다. 이 기본 사례는 [-1, 1) 에서 다루 므로 재귀 공식과 함께 f 의 정의를 완성합니다 .

작동 원리

이전과 같이 n + x 가 모나 딕 프로그램의 유일한 인수 라고하자 .

¡A는 빠른 그것으로는 왼쪽과 회전 그들에게 몇 가지 링크 소비 즉, 퀵 링크를 . ¡특히 하나 또는 두 개의 링크를 소비합니다.

  • <F:monad|dyad><N:any>링크 N을 호출하고 r을 반환 하고 F 를 총 r 번 실행 합니다.

  • <nilad|missing><F:monad|dyad>세트 r에 마지막 명령 줄 인수 (또는 부재하에 STDIN로부터의 입력)하고 실행한다 FR의 시간.

이후 1nilad (인수가없는 링크)이고, 두 번째 경우에 적용하고 실행할 + N 배 (비정 인수 둥근 다운). 을 호출 할 때마다 +퀵 링크의 왼쪽 인수는 반환 값으로 바뀌고 오른쪽 인수는 왼쪽 인수의 이전 값으로 바뀝니다.

전체 프로그램에 관해서는, 입력을 바닥 화하여 n을 산출합니다 . 그런 다음 _입력에서 결과 를 빼고 ** x를 산출하여 반환 값이됩니다.

1+¡그런 다음 앞에서 설명한대로 왼쪽 인수 1 = f (0 + x) 및 오른쪽 인수 x = f (-1 + x)로 호출 하여 원하는 출력을 계산합니다.


아, 피보나치 도전에 얼마나 유용한 지 . ¡dyads와 피보나치 같은 일 을하는 것이 목적이 있었습니까 ?
Outgolfer Erik

우 - %1+¡: 선형 보간과 N × F (N) 에서의 NN × F (N-1) + F (N)N-ε 와 단계 사이 N-εN .
Jonathan Allan

@EriktheOutgolfer 글쎄요. Jelly에는 변수가 없으므로 이전 시퀀스 멤버에 대한 액세스 권한이 손실되므로 이와 같이 구현하는 것이 좋습니다.
Dennis

@JonathanAllan 잘 모르겠습니다. 무엇입니까 %1+¡어떻게해야?
Dennis

@Dennis 음, 의미 , 잘 \ _o_ / ...하지만 그게 실험을 함께 할 것으로 보인다 것입니다 : D
조나단 앨런

5

수학, 32 바이트

If[#<2,1~Max~#,#0[#-1]+#0[#-2]]&

음수가 아닌 실수를 입력으로 받아서 실수를 반환하는 순수한 함수. 1~Max~#로 대체 된 경우 1정수 인수에 대해 0으로 색인 된 피보나치 수의 표준 재귀 정의입니다. 그러나 1~Max~#0과 2 사이의 실제 입력에 대한 올바른 부분 선형 함수이며 재귀는 나머지를 처리합니다. (하찮은 사실은 : 1 - 인덱스 피보나치 수열이를 변경하면 변경하여 간단하게 수행 할 수 있습니다 MaxA를 Min!)

내장으로 얻을 수있는 가장 짧은 것은 37 바이트 (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&입니다.



3

자바 스크립트 (ES6), 30 바이트

f=x=>x<1?1:x<2?x:f(x-1)+f(x-2)
<input type=number value=2.4 oninput="O.value=f(value)"> <input id=O value=2.4 disabled>

제로 인덱스 재귀 피보나치 시퀀스 정의의 사소한 수정. 일부 입력에 대해 약간의 반올림 오류가 발생할 수 있습니다.


이것은 영리합니다. 나는 그것이 작동하지 않는다고 생각했다.
Leaky Nun

1

젤리 , 17 12 바이트

’Ñ+Ñ
’»0‘ÇỊ?

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

내장되지 않은 솔루션.

설명

도우미 기능 1Ŀ

’Ñ+Ñ
 Ñ    Call the main program on
’       {the input} - 1;
   Ñ  Call the main program on {the input};
  +   Add those results{and return the result}

주요 프로그램

’»0‘ÇỊ?
’        Subtract 1
 »0      but replace negative results with 0
     Ị?  If the result is less than or equal to 1
   ‘     Return the result plus 1
    Ç    else return the result

따라서 0에서 1 사이의 입력은 0을 포화 빼기하므로 1을 더하여 F (0) = F (1) = 1을 얻습니다. 1에서 2 사이의 입력은 스스로를 반환합니다. 이러한 기본 사례는 일반적인 피보나치 재귀를 수행하고 거기에서 다른 값을 계산하기에 충분합니다.


1

엑셀, 13712411911310297 바이트

비재 귀적 / 반복적 접근. (n 번째 항을 직접 계산)이 방법은 1- 색인 방법을 사용합니다 . 추가하면 색인이 0 +1으로 =TRUNC(B1)변경됩니다.

=A7+(A8-A7)*MOD(B1,1)
=5^.5
=(1+A2)/2
=TRUNC(B1)
=A4+1
=-1/A3
=(A3^A4-A6^A4)/A2
=(A3^A5-A6^A5)/A2

코드 스 니펫은 A1 셀부터 시작하도록되어 있습니다 .

입력 셀은 B1 입니다. 출력 셀은 A1 입니다.


1

자바 스크립트 (ES6), 67 64 바이트

반올림과 관련하여 몇 가지 문제가 있습니다.

n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)

시도 해봐

f=
n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)
console.log(f(2.4))
console.log(f(6.35))
console.log(f(42.42))



0

젤리 , 13 9 바이트

,‘ḞÆḞḅ%1$

이것은 챌린지 사양과 동일한 인덱싱을 사용합니다.

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

배경

스펙 당 우리가 F (N + X) = F (N) + (F (N + 1) - F (N)) X 천연 들어, N0 ≤ X <1 . 이후 F (N + 1) = F (N) + F는 (N - 1) 이 같이 다시 쓸 수 - × (N + X) = F (N) + F (1 N) F .

또한 챌린지 사양에 사용 된 인덱싱은 함수 f (n) = F (n + 1) (여기서 F 는 일반적인 피보나치 함수, 즉 F (0) = 0 )를 정의하므로 공식 f (n + x) = F (n + 1) + F (n) x 입니다.

작동 원리

,‘ḞÆḞḅ%1$  Main link. Argument: n + x

 ‘         Increment; yield n + 1 + x.
,          Pair; yield [n + x, n + 1 + x].
  Ḟ        Floor; yield [n, n + 1].
   ÆḞ      Fibonacci; yield [F(n), F(n + 1)].
      %1$  Modulus 1; yield (n + x) % 1 = x.
     ḅ     Unbase; yield F(n)x + F(n + 1).

0

펄 6 ,  48  38 바이트

48

{$/=(1,1,*+*...*)[$_,$_+1];$0+($_-.Int)*($1-$0)}

시도 해봐

38

sub f(\n){3>n??max 1,n!!f(n-1)+f(n-2)}

시도 해봐

넓히는:

48

{
  $/ =          # store here so we can use $0 and $1
  (
    1,1,*+*...* # Fibonacci sequence
  )[
    $_,         # get the value by using floor of the input
    $_ + 1      # and get the next value
  ];

    $0            # the first value from above
  +
    ( $_ - .Int ) # the fractional part of the input
  *
    ( $1 - $0 )   # the difference between the two values in the sequence
}

( $0$1의 약자 $/[0]$/[1])

38

sub f (\n) {
    3 > n           # if n is below 3
  ??
    max 1, n        # return it if it is above 1, or return 1
                    # if it was below 1, the answer would be 1
                    # the result for numbers between 1 and 3
                    # would be the same as the input anyway
  !!
    f(n-1) + f(n-2) # the recursive way to get a fibonacci number
}

이것은 다른 PythonJavascript 솔루션 에서 영감을 얻었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.