음의 피보나치 수


28

피보나치 수열을 모두 알고있을 것입니다.

fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)
fibonacci(0)=0
fibonacci(1)=1

당신의 작업은 다음과 같이 간단합니다.

  • 주어진 정수 N계산fibonacci(n)

그러나 여기에 비틀기가 있습니다.

  • 또한 부정적인 일을 N

기다림. 뭐?

fibonacci(1)=fibonacci(0)+fibonacci(-1)

그래서

fibonacci(-1)=1

fibonacci(-2)=fibonacci(0)-fibonacci(1)=-1

등등...

  • 이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.
  • 기능 또는 전체 프로그램을 제출할 수 있습니다
  • N은 [-100,100]입니다

CSV의 테스트 사례 :

-9;-8;-7;-6;-5;-4;-3;-2;-1;0;1;2;3;4;5;6;7;8
34;-21;13;-8;5;-3;2;-1;1;0;1;1;2;3;5;8;13;21

힌트:

n <0 및 n & 1 == 0 :

fibonacci(n)=fibonacci(abs(n))*-1


아니요. 마이너는 음수도 지원하기를 원합니다.
Roman Gräf

7
나는 이것이 속담이 아니라고 생각한다. 기존 피보나치 챌린지의 첫 페이지에 대한 답변 중 1 개만 부정적인 것을 처리 할 수 ​​있으며 나머지는 모두 거꾸로 변경해야합니다.
xnor

일부를 추가했습니다. 더 추가하십시오. @Flip
Roman Gräf

1
테스트 케이스의 형식화에 대한 이 메타 포스트를 읽으십시오 . 멋진 테이블을 피하십시오
FlipTack

CSV로 SSV (세미콜론으로 구분 된 값)를 의미합니까?
NH.

답변:


22

수학, 9 바이트

Fibonacci

예,이 내장 함수는 음수를 지원합니다.


2
이것은 거의 한마디 한마디로 제가 올게 될 답입니다. : D
Greg Martin

17

옥타브, 20 바이트

 @(n)([1,1;1,0]^n)(2)

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

설명

이것은 피보나치 시퀀스 f(n)를 다음과 같이 쓸 수 있다는 사실을 이용합니다 (이것은 행렬 벡터 표기법이어야합니다).

재귀 적으로 :

[f(n+1)]  = [1  1] * [f(n)  ]
[f(n)  ]    [1  0]   [f(n-1)]

명시 적으로 :

[f(n+1)]  = [1  1] ^n * [1]
[f(n)  ]    [1  0]      [0]

이것은이 행렬의 오른쪽 위 항목이 우리가 찾고 n있는 가치라는 f(n)것을 의미합니다. 분명히 우리는이 행렬이 전체 순위를 가지므로 반전시킬 수 있으며 관계는 여전히 동일한 반복 관계를 나타냅니다. 즉, 음의 입력에도 작동합니다.


1
(어떻게) 이것은 부정적인 입력에도 적용됩니까?
Roman Gräf

네, 설명
이옵니다

되는 ans(-6)긍정적 의미?
FlipTack

@FlipTack 죄송합니다. 인덱스 이동 때문일 수 있습니다. 나는 1 기반을 사용했지만 질문은 0 기반을 사용했지만 지금 고쳤습니다.
flawr


11

파이썬, 43 바이트

g=5**.5/2+.5
lambda n:(g**n-(1-g)**n)/5**.5

황금 비율을 가진 직접적인 공식 g. 와 f상기 기능 :

for n in range(-10,11):print f(n) 

-55.0
34.0
-21.0
13.0
-8.0
5.0
-3.0
2.0
-1.0
1.0
0.0
1.0
1.0
2.0
3.0
5.0
8.0
13.0
21.0
34.0
55.0

길이가 5이고 제곱근의 앨리어싱 만 동일합니다.

a=5**.5
lambda n:((a+1)**n-(1-a)**n)/a/2**n

나는 이것들과 경쟁 할 수있는 재귀 함수를 만드는 방법을 보지 못했습니다. 57 바이트에 대한 약간의 골퍼 시도

f=lambda n:n<0and(-1)**n*f(-n)or n>1and f(n-1)+f(n-2)or n

비교를 위해 반복 메소드 (Python 2에서 60 바이트) :

n=input()
a,b=0,1;exec"a,b=b,a+b;"*n+"a,b=b-a,a;"*-n
print a

또는 58 바이트의 경우 :

n=input()
a,b=0,1;exec"a,b=b,a+cmp(n,0)*b;"*abs(n)
print a

10

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

f=n=>n<2?n<0?f(n+2)-f(n+1):n:f(n-2)+f(n-1)

테스트


나는 당신의 기능을 정말 좋아합니다. 여기에 제안이 있었지만-를 간과했기 때문에 작동하지 않습니다 ...
Luke

5

MATL , 11 9 바이트

나는 약 행복 해요 [3,2]누군가가 방법을 알고 있다면 () 나 =을 알려 주시기 바랍니다, 반드시 golfed 될 수있는, 그것은 것 또한으로 작업 [1,3].) -2 바이트 = 주셔서 감사합니다 @LuisMendo)

IHhBiY^2)

이것은 Octave annswer 와 같은 접근 방식을 사용하고 있습니다. 하지만 행렬을 생성하려면

[1,1]
[1,0]

우리는 단지 Conver 유럽 숫자 32소수점에서 바이너리 (즉,로 11하고 10).

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


5

자바 스크립트 (ES7) 37 바이트

Binet의 Formula를 사용합니다 .

n=>((1+(a=5**.5))**n-(1-a)**n)/a/2**n

이 출력 n번째 피보나치 수 + - 0.0000000000000005.


**ES7이 필요합니다.
Neil

오, 그것이 ES6의 일부라고 생각했지만 당신 말이 맞습니다. 그것을 바꿨다. 또한 1B 저장을 위해 다른 버전의 Binet 's Formula를 사용했습니다.
Luke

이제 그것에 대해 생각하기 때문에 1-p대신 대신 사용하는 것이 -1/p동일한 절약을 위해 작동해야합니다.
Neil

3

줄프, 2 바이트

mL

여기 사용해보십시오!

phi공식을 사용하여 구현 된 피보나치 내장 .


잡히지 않은 SyntaxError : 예기치 않은 토큰 | 형식화 된 p (math.min.js : 27)의 Object (math.min.js : 27)에서 p (math.min.js : 27)의 새 함수 (<anonymous>)에서 <anonymous> : 36:14)에서 Object.n [공장으로] (math.min.js : 45)에서 t (math.min.js : 27)에서 f (math.min.js : 27)에서 Object.get에서 [중앙값으로] rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf의 클론 (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902)에서] (math.min.js : 27). js : 2128 (최신 Chrome, 버전 55.0.2883.87m)
Ismael Miguel

@IsmaelMiguel 이것은 파이어 폭스에서만 작동합니다
Conor O'Brien

나는 전혀 몰랐다, 그것은 어디에도 없다
Ismael Miguel

2

하스켈, 51 바이트

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z

1
가드 내의 여러 테스트 ,&&다음 대신에 결합 할 수 있습니다 even z,z<0.
nimi

1

PowerShell , 112 바이트

function f($n){$o=('-','+')[$n-lt0];&(({$a,$b=(2,1|%{f("$n$o$_"|iex)});"$a- $o$b"|iex},{$n*$n})[$n-in(-1..1)])}

데모 콜 :

-9..9 | %{"{0,2}`t=> {1,3}" -f $_,(f($_))} 

데모 출력 :

-9  =>  34
-8  => -21
-7  =>  13
-6  =>  -8
-5  =>   5
-4  =>  -3
-3  =>   2
-2  =>  -1
-1  =>   1
 0  =>   0
 1  =>   1
 2  =>   1
 3  =>   2
 4  =>   3
 5  =>   5
 6  =>   8
 7  =>  13
 8  =>  21
 9  =>  34

1

Lithp , 88 바이트

#N::((if(< N 2)((if(< N 0)((-(f(+ N 2))(f(+ N 1))))((+ N))))((+(f(- N 2))(f(- N 1))))))

나는 그 모든 괄호를 봅니다.

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

정말 작지 않습니다. 현재 (get N)또는 (+ N)단순히 대신 사용하는 구문 분석 버그가 N있습니다. 더 작은 것을 선택했습니다. 그러나 나는 이것을 골프하기 위해 더 할 수있는 일이 없다고 생각합니다.

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