피보나치 번호입니까?


49

당신의 작업 :

입력 된 숫자피보나치 숫자 인지 확인하는 프로그램 또는 함수를 작성하십시오 . 피보나치 수는 피보나치 수열에 포함 된 수입니다.

피보나치 수열은 다음과 같이 정의됩니다 : F(n) = F(n - 1) + F(n - 2)

씨앗이 F(0) = 0있고 F(1) = 1.

입력:

피보나치 수일 수도 있고 아닐 수도있는 0에서 1,000,000,000 사이의 음이 아닌 정수.

산출:

입력이 피보나치 수인지 여부를 나타내는 참 / 거짓 값입니다.

예 :

0-->truthy
1-->truthy
2-->truthy
12-->falsy

채점 :

이것은 이며 가장 낮은 바이트 수입니다.


2
내가 사용하는 프로그래밍 언어는 최대 9999 (Geometry Dash)의 숫자 만 지원합니다. 이론적으로 최대 1000000을 지원한다고 가정해도 괜찮습니까?
MilkyWay90

답변:


36

Neim , 2 바이트

f𝕚

설명:

f       Push an infinite fibonacci list
 𝕚      Is the input in that list?

It 's Hip to be Square 답변 과 동일하게 작동 하지만 f피보나치 에는 다른 무한 목록을 사용합니다 .

시도 해봐!


1
와! 인상적인 점수.
그리폰-복원 모니카

2
훌륭하지만 2 바이트는 아닙니다. UTF-8에서는 "66 F0 9D 95 9A"로 표시됩니다
sm4rk0

10
@ sm4rk0 훌륭하지만, 틀 렸습니다. Neim은 커스텀 코드 페이지 를 사용하므로 이것의 바이트 표현은66 D5
Okx

입력이 목록에없는 경우이 루프가 영원히 반복되지 않습니까? 그렇다면 거짓으로 간주됩니까?
Enrico Borba

@EnricoBorba Neim은이 무한 목록의 n 번째 요소는 항상 목록의 n + 1 번째 요소보다 작거나 같다는 것을 알고 있습니다. 따라서 스스로 잡을 수 있으며 영원히 실행되지는 않습니다. 프로그램을 사용해 보셨습니까? : P
Okx

18

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

f=(n,x=0,y=1)=>x<n?f(n,y,x+y):x==n

입력보다 크거나 같은 항목을 찾을 때까지 피보나치 시퀀스를 재귀 적으로 생성 한 다음 item == 입력을 반환합니다.


NB : 피보나치 수열의 순진 재귀 계산은 O (Fib (n))-대략 O (1.6 ^ n)
Alnitak

f = n => n? n> 2? f (n-1) + f (n-2) : 1 : 0 28bytes
jackkav

@jackkav 감사합니다. 그러나 입력 이 피보나치 수 인지 확인해야합니다 .
ETHproductions

12

레티 나 , 23 바이트

^$|^(^1|(?>\2?)(\1))*1$

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

단항, 출력 0또는로 입력하십시오 1.

설명

피보나치 수열은 정방향 참조, 즉 주변 그룹을 나타내는 "역 참조"또는 정규식 후반부에 나타나는 "역 참조"에 대한 훌륭한 후보입니다. 이와 같은 숫자를 일치시킬 때 시퀀스 요소 간의 차이에 대한 재귀 표현식을 찾아야합니다 . 예를 들어 삼각형 숫자와 일치시키기 위해 일반적으로 이전 세그먼트에 1을 더합니다. 차이를 홀수 인 제곱 수와 일치시키기 위해 이전 세그먼트에 2를 더한 값을 찾습니다.

마지막 요소에 마지막부터 두 번째 요소를 추가하여 피보나치 수를 얻으므로, 이들 사이의 차이점은 피보나치 수이기도합니다. 따라서 각 세그먼트를 이전 두 개의 합계로 일치시켜야합니다. 정규식의 핵심은 다음과 같습니다.

(         # This is group 1 which is repeated 0 or more times. On each
          # iteration it matches one Fibonacci number.
  ^1      # On the first iteration, we simply match 1 as the base case.
|         # Afterwards, the ^ can no longer match so the second alternative
          # is used.
  (?>\2?) # If possible, match group 2. This ends up being the Fibonacci
          # number before the last. The reason we need to make this optional
          # is that this group isn't defined yet on the second iteration.
          # The reason we wrap it in an atomic group is to prevent backtracking:
          # if group 2 exists, we *have* to include it in the match, otherwise
          # we would allow smaller increments.
  (\1)    # Finally, match the previous Fibonacci number and store it in
          # group 2 so that it becomes the second-to-last Fibonacci number
          # in the next iteration.
)*

이제이 시작되는 피보나치 수를 추가 끝 1 , 즉 , 1, 1, 2, 3, 5 ... . 그것들은 1, 2, 4, 7, 12, ... 까지 합산합니다 . 즉, 그들은 피보나치 수보다 하나 적으므로 1끝에를 추가합니다 . 이것이 다루지 않는 유일한 경우는 0이므로 우리는 ^$처음에 그것을 다루는 대안이 있습니다.


2
매우 우아합니다! 나는 완전성을 위해 소유 정량 ^$|^(^1|\2?+(\1))*1$
자를

1
@Deadcode 나는 .NET에서 그것들을 많이 그리워한다;)
Martin Ender

불필요한 초를 제거하여 1 바이트를 저장하십시오 ^.

12

정규식 (ECMAScript를 풍미) 392 358 328 224 206 165 바이트

피보나치 수를 ECMAScript 정규식 (단항)과 일치시키기 위해 필요한 기술은 대부분의 다른 정규식에서 가장 잘 수행되는 방법과는 거리가 멀습니다. 순방향 / 중복 역 참조 또는 재귀가 없으면 총계를 직접 계산하거나 유지하는 것이 불가능합니다. 뒤돌아보기가 부족하여 작업하기에 충분한 공간을 확보해야하는 경우가 많습니다.

많은 문제는 완전히 다른 관점에서 접근해야하며, 중요한 통찰력이 도착할 때까지는 해결할 수없는 것처럼 보입니다. 작업중 인 숫자의 수학적 속성을 사용하여 특정 문제를 해결할 수있게하는 데 더 넓은 그물을 캐스트해야합니다.

2014 년 3 월에 피보나치 수에 대해 이런 일이 발생했습니다. Wikipedia 페이지를 살펴보면 처음에는 방법을 알아낼 수 없었지만 특정 속성 하나가 열광적으로 가깝게 보였습니다. 그런 다음 수학자 teukon 은 그 속성을 다른 속성과 함께 사용하여 가능하다는 것을 분명히하는 방법을 설명했습니다. 그는 실제로 정규 표현식을 만드는 것을 꺼려했습니다. 내가 가서 그것을했을 때 그의 반응 :

넌 미쳤어! ... 나는 당신이 이것을 할 것이라고 생각했습니다.

다른 ECMAScript 단항 수학 정규 표현식 게시물과 마찬가지로 경고를 표시합니다. ECMAScript 정규 표현식에서 단항 수학 문제를 해결하는 방법을 배우는 것이 좋습니다. 그것은 나를 위해 매혹적인 여행이었고, 나는 그것을 스스로 시도하고 싶을지도 모르는 사람, 특히 수 이론에 관심이있는 사람들을 위해 그것을 망치고 싶지 않습니다. 스포일러 태그가 붙은 권장 문제를 하나씩 해결하는 데 대한 목록은 해당 게시물참조하십시오 .

따라서 단항 정규식 마술이 당신을 망치고 싶지 않다면 더 이상 읽지 마십시오 . 이 마법을 스스로 파악하는 데 총력을 기울이고 싶다면 위에 링크 된 게시물에 요약 된 ECMAScript 정규식의 일부 문제를 해결하는 것이 좋습니다.

내가 처음 직면 한 도전은 : 양의 정수 X는 피보나치 번호 만 배 경우 경우 2 + 4 및 / 또는 5 배 2 - 4 완벽한 광장입니다. 그러나 정규 표현식에서는 이것을 계산할 여지가 없습니다. 우리가 작업해야하는 유일한 공간은 숫자 자체입니다. 우리는 5를 곱 하거나 정사각형을 취할 공간이 충분하지 않습니다 .

그것을 해결하는 방법에 대한 teukon의 아이디어 ( 원래 여기에 게시 됨 ) :

정규식은 ^x*$z 형식의 문자열로 표시되며 z는 길이입니다. z가 손으로 처음 몇 피보나치 수 중 하나인지 여부를 확인하십시오 (최대 21 개). 그렇지 않은 경우 :

  1. b가 2a보다 크지 않도록 두 개의 숫자 a <b를 읽습니다.
  2. 전방 예측을 사용하여 a 2 , ab 및 b 2를 작성하십시오 .
  3. 하나 5A 주장 2 + 4 또는 5A 2 4 완벽한 사각형 (그래서이 F이어야합니다 -는 N-1 일부 N)입니다.
  4. 5b 2 + 4 또는 5b 2 + 4가 완전 제곱 임을 가정하십시오 (따라서 b는 F n 이어야합니다 ).
  5. 이전에 빌드 한 a 2 , ab 및 b 2 와 ID 를 사용하여 z = F 2n + 3 또는 z = F 2n + 4인지 확인하십시오.
    • F 2n-1 = F n 2 + F n-1 2
    • F 2n = (2F n-1 + F n ) F n
간단히 말해서, 이러한 정체성들은 우리가 주어진 숫자가 피보나치인지 확인하는 문제를 훨씬 더 작은 숫자 쌍이 피보나치인지 확인하는 문제를 줄일 수있게합니다 . 작은 대수는 충분히 큰 n (n = 3 이해 야 함), F 2n + 3 > F n + 5F n 2 + 4에 대해 항상 충분한 공간이 있어야 함을 보여줍니다.

그리고 여기 에 정규식에서 구현하기 전에 테스트로 작성한 C의 알고리즘 모형이 있습니다.

따라서 더 이상 고민하지 말고 여기에 정규식이 있습니다.

^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$

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

그리고 잘 인쇄되고 주석이 달린 버전 :

^(
  (?=
    (x*)                   # \2+1 = potential number for which 5*(\2+1)^2 ± 4
                           # is a perfect square; this is true iff \2+1 is a Fibonacci
                           # number. Outside the surrounding lookahead block, \2+1 is
                           # guaranteed to be the largest number for which this is true
                           # such that \2 + 5*(\2+1)^2 + 4 fits into the main number.
    .*
    (?=                    # tail = (\2+1) * (\2+1) * 5 + 4
      x{4}
      (                    # \3 = (\2+1) * 5
        x{5}
        (\2{5})            # \4 = \2 * 5
      )
      (?=\3*$)
      \4+$
    )
    (|x{4})                # \5 = parity - determined by whether the index of Fibonacci
                           #               number \2+1 is odd or even
    (?=xx (x*)(\6 x?))     # \6 = arithmetic mean of (\2+1) * (\2+1) * 5 and \8 * \8,
                           #      divided by 2
                           # \7 = the other half, including remainder
    \5
    # require that the current tail is a perfect square
    (x(x*))                # \8 = potential square root, which will be the square root
                           #      outside the surrounding lookahead; \9 = \8-1
    (?=(\8*)\9+$)          # \10 = must be zero for \8 to be a valid square root
    (?=\8*$\10)
    \8*
    (?=(x\2\9+$))          # \11 = result of multiplying \8 * (\2+1), where \8 is larger
    (x*)\12                # \12 = \11 / 2; the remainder will always be the same as it
                           #       is in \7, because \8 is odd iff \2+1 is odd
  )
  \7\11
  (
    \6\11
  |
    \12
  )
|
  x{0,3}|x{5}|x{8}|x{21}   # The Fibonacci numbers 0, 1, 2, 3, 5, 8, 21 cannot be handled
                           # by our main algorithm, so match them here; note, as it so
                           # happens the main algorithm does match 13, so that doesn't
                           # need to be handled here.
)$

곱셈 알고리즘은 그 의견에 설명되어 있지 않지만 풍부한 숫자 regex post 의 단락에 간단히 설명되어 있습니다.

나는 피보나치 정규식의 여섯 가지 버전을 유지하고 있었다. 가장 짧은 길이에서 가장 빠른 속도로 래칫하고 위에서 설명한 알고리즘을 사용하는 네 가지 버전과 다른, 훨씬 더 빠르지 만 훨씬 더 긴 알고리즘을 사용하는 두 가지 버전을 실제로 유지했다. 일치하는 피보나치 인덱스 (여기서는 알고리즘이이 게시물의 범위를 벗어나지 만 설명 은 원래 토론 Gist )에 설명 되어 있습니다. 나는 PCRE와 Perl에서 모든 테스트를 수행 할 때 정규식의 많은 비슷한 버전의 정규식을 다시 유지하지 않을 것이라고 생각하지만 내 정규식 엔진 속도에 대한 관심이 더 이상 중요하지 않을 정도로 충분히 빠릅니다 (특정 구조가 병목 현상을 일으키는 경우 최적화를 추가 할 수 있습니다) – 아마도 하나의 가장 빠른 버전과 하나의 가장 짧은 버전을 다시 유지해야 할 것입니다. 속도가 충분히 컸습니다.

"피보나치 지수에서 1을 뺀 값을 일치로 반환"버전 (심하게 골프를 치지 않음) :

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

모든 버전은 골프 최적화의 전체 커밋 히스토리와 함께 github에 있습니다.

피보나치 수 일치에 대한 정규식 - 짧은 속도 0.txt (포스트와 같이 최단하지만 최저 하나)
피보나치 수 일치에 대한 정규식 - 짧은 속도 1.TXT의
정규식 피보나치 수를 일치시키기 위해 - 짧은 속도 2.txt에
대한 정규식 피보나치 수와 일치-짧고 속도
피보나치 수 와 일치하는 3.txt 정규식 -fast.txt 피보나치 수와 일치하는 정규식 -return
index.txt


9

파이썬 3 , 48 바이트

lambda n:0in((5*n*n+4)**.5%1,abs(5*n*n-4)**.5%1)

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


1
파이썬은 충분한 리소스가 주어지면 임의로 큰 입력에 작동하지 않아야합니까?
Jonathan Allan

2
계산이 데이터 유형과 이론에 무한 정밀도로 적합하면 실제로 작동하기 때문에 원하는 알고리즘을 사용할 수 있다는 인상을 항상 받았습니다. 물론 int막대 만 사용 하면 막대가 더 높아지지만 (임의로 크지는 않지만) C 응답이 64 비트 정수 (또는 gcc와 함께 128 비트)를 사용하도록 강요하지는 않습니다. 어쨌든 한 언어에서는 동일한 알고리즘을 사용할 수 있지만 다른 언어는 그렇지 않은 것처럼 보입니다.
Dennis

알고리즘 관점은 의미가 있습니다 (저는 항상 "데이터 유형에 적합"기준을 지시하는 입력 도메인이라고 생각했습니다). 주의해야 할 것은 알고리즘 아이디어 와 구현 사이의 회색 영역 입니다. 여기에 한 정수 중 하나가 수레에 캐스팅없이 평방 있는지 확인하십시오. 나는 합법적이고 작동하는 알고리즘의 일부인 한 부작용으로 내부 캐스트를 사용할 수 있다고 생각합니다 (그리고 캐스트에 의존 하는 알고리즘이 허용되지 않을 것이라고 확신합니다 ).
Jonathan Allan

@JonathanAllan 처리 할 수있는 최대 값은 1e9이므로 임의로 큰 입력이 문제가 될 것이라고 생각하지 않습니다.
JAD

1
@JarkoDubbeldam 네, 제 의견은 실제로 세부 사항이 변경되었습니다.
Jonathan Allan

7

파이썬 2, 48 44 바이트

f=lambda n,a=0,b=1:n>a and f(n,b,a+b)or n==a

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

4 바이트를 절약 해 준 Jonathan Allan에게 감사합니다


truthy 값이 될 수있는 경우에, 47 바이트가 될 수 Falsefalsy 값 True: TIO!
Mr. Xcoder 2016 년

n-a대신 n==a-1과 0을 반환 값으로 사용할 수도 있습니다 .
Magic Octopus Urn

@carusocomputing 편집 내역에 해당 내용이 있었지만 작동하지 않습니다. 테스트 값이 클수록 -101또는 대신 다른 결과 가있을 수 있기 때문 입니다 -1.
mbomb007

@ Mr.Xcoder 당신은 정말로 1 바이트를 절약하는 것이 모든 사람의 건강에 가치가 있다고 생각합니까?
frarugi87

1
@ frarugi87 바이트 절약은 항상 가치가 있습니다
Mr. Xcoder

7

05AB1E , 8 7 바이트

>ÅF¹å¹m

설명:

>ÅF       # Generate Fibbonacci numbers up to n+1
   ¹å     # 0 if original isn't in the list, 1 if it is
     ¹m   # 0**0 = 1 if input was 0 (hotfix for 0).
          # or 0**n if not fibb / 1**n if it is a fibb.

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

0이 아닌 피보나치 수 해결 방법에 대한 Jonathan Allan에게 감사드립니다.


실제로 6 바이트로 업데이트되지 않습니다. 3 바이트 미만의 목록에 0을 추가 할 수있는 방법이 없다고 믿을 수 없습니다.
Magic Octopus Urn

@JonathanAllan 05AB1E의 "생성 피보나치 함수"는 0을 포함하지 않습니다.
Magic Octopus Urn

@JonathanAllan 지금 이해하고 있습니다. 좋은 생각입니다. 실제로 무슨 일이 일어나고 있는지 알아 내기 위해 잠시 시간을 내주었습니다.
Magic Octopus Urn

포괄적 n으로 바이트를 저장하는 것만으로는 충분하지 않으며 어느 쪽이든 발생할 수 있습니까? ÅF¹å0n=0
Emigna 2016 년

0AF = []. 1AF = [1,1]. 분명히 그렇지 않습니다.
Magic Octopus Urn



5

젤리 ,  8 7  6 바이트

-r‘ÆḞċ

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

어떻게?

-r‘ÆḞċ - Link: non negative number, n
-      - literal -1      = -1
 r     - inclusive range = [-1,0,1,2,3,4,5,...,n]
  ‘    - increment n     = [ 0,1,2,3,4,5,6,...,n+1]
   ÆḞ  - Fibonacci       = [ 0,1,1,2,3,5,8,...,fib(n+1)]
     ċ - count occurrences of n (1 if n is a Fibonacci number, 0 otherwise)

노트:

  • 증가는 , 그래서이 작동 필요한 23 그들이 있기 때문에, 3 번째4 번째 이상 - 피보나치 수 3 모든 피보나치 숫자가 인덱스보다 크다.
  • -필요 (아니라 단지보다 ‘R) 그래서 이것은 작동 0 부터 0 은 IS 0 번째 피보나치 수;

음, 이것은 내 대답과 너무 비슷해 보입니다.
Erik the Outgolfer

내가 작동을 제외하고 아, 나는 당신을 아래로 내 golfed 3:
조나단 앨런을

으악 ... 피보나치가 이상해. (당신이 그렇게 말하면 btw는 내 대답을 삭제했습니다)
Outgolfer Erik

마지막 메모가 확실합니까? 0에서 시작하는 목록에서 피보나치 원자를 실행하면 출력에 0이 포함됩니다.
산란

1
챌린지의 문구에 따라 관련이없는 것처럼 보이지만 피보나치 수 목록에서 인수로 1을 가진 수 원자를 사용하면 결과는 2 (1이 아님)입니다.
FryAmTheEggman 2016 년

5

ZX81 BASIC 180 151 100 ~ 94 바이트 토큰 BASIC

SinclairZXWorld 포럼의 Moggy 덕분에 더 많은 바이트를 절약 할 수있는 훨씬 깔끔한 솔루션이 있습니다.

 1 INPUT I
 2 FOR F=NOT PI TO VAL "1E9"
 3 LET R=INT (VAL ".5"+(((SQR VAL "5"+SGN PI)/VAL "2")**I)/SQR VAL "5")
 4 IF R>=I THEN PRINT F=R
 5 IF R<I THEN NEXT F

피보나치 수를 입력하면 1을 출력하고 그렇지 않으면 0을 출력합니다. 이렇게하면 바이트가 절약되지만 아래의 이전 솔루션보다 훨씬 느립니다. 속도 (그러나 더 많은 기본 바이트)의 VAL경우 문자열 리터럴 숫자 주위의 래퍼를 제거하십시오 . 다음은 몇 가지 설명이 포함 된 이전 솔루션입니다.

 1 INPUT A$
 2 LET A=SGN PI
 3 LET B=A
 4 LET F=VAL A$
 5 IF F>SGN PI THEN FOR I=NOT PI TO VAL "1E9"
 6 LET C=A+B
 7 LET A=B
 8 LET B=C
 9 IF B>=F THEN GOTO CODE "£"
10 IF F THEN NEXT I
12 PRINT STR$(SGN PI*(B=F OR F<=SGN PI)) AND F>=NOT PI;"0" AND F<NOT PI

위의 수정은 12 행에서 IF명령문을 하나로 압축하기 위해 추가 BASIC 바이트를 절약합니다 PRINT. 다른 바이트는 VAL키워드와 GOTO CODE "£"ZX81 문자 세트에서 12를 사용하여를 사용하여 저장되었습니다. 모든 숫자 값이 부동 소수점으로 저장되므로 문자열은 숫자보다 많은 바이트를 저장하므로 VAR 스택에서 더 많은 공간을 차지합니다.

여기에 이미지 설명을 입력하십시오


실제로 6 줄을 모두 제거하고 5 줄을 변경하여 6 개의 토큰 화 된 기본 바이트를 절약 할 수 있습니다 5 IF R<F THEN NEXT I!
Shaun Bebbers

4

C #, 109 바이트

bool f(int n){int[]i=new[]{0,1,0};while(i[0]<n||i[1]<n){i[i[2]%2]=i[0]+i[1];i[2]++;}return n==i[0]||n==i[1];}

확실히 개선 될 수 있었지만 시간이 없었습니다.


PPCG에 오신 것을 환영합니다!
Martin Ender 2016 년

1
나는 그것이 당신과 동일하다는 것을 깨닫기 위해서만 내 자신의 대답을 썼습니다. 람다 식과 간단한 변수를 사용하여 이것을 얻을 수 있습니다 : n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}(80 바이트). 온라인으로 사용해보십시오!
Charlie

1
로 그에 추가 2 바이트를 저장 @CarlosAlejo a+=b대신 a=a+b하고 b+=a대신 b=a+b.
TheLethalCoder

4

> <> , 21 19 + 3 = 24 22 바이트

i1\{=n;
?!\:@+:{:}(

프로그램 시작시 입력이 스택에 있어야하므로 -v플래그의 +3 바이트입니다 .

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

피보나치 숫자가 입력 숫자보다 크거나 같아 질 때까지 생성 한 다음 마지막으로 생성 된 숫자와 입력이 같은지 확인합니다. 1피보나치 수이면 출력 하고, 0그렇지 않으면 출력 합니다 .

이를 0올바르게 처리 하기 위해 시드는 -1 1처음 생성되는 숫자가 0아니라 시드입니다 1.

STDIN이 비어있을 때 스택 i에 밀어 넣을 수있는 @cole에게 감사드립니다 -1. 매우 영리한!

이전 버전:

01-1\{=n;
}(?!\:@+:{:

이제 바이트를 낭비하여 계속해서 생성 된 각 숫자를 확인하는 것에 대해 바보 같은 느낌이 들었습니다. 잘 했어요!
Emigna

1
i대신 22 바이트를 사용 합니다 01-.
cole

@cole은 물론 STDIN에 입력이 없을 때 i와 같이 사용 -1한다고 생각하지 않습니다. 잘 했어요!
Sok

3

수학, 37 바이트

!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&

@ngenisis에서 -4 바이트


Fibonacci[0]제공 0저장할 수 있도록 4포함하여 바이트를 0Table범위. infix notation을 사용하여 다른 바이트를 저장할 수 있습니다 Table.!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
ngenisis

3

MATL (16 바이트)

2^5*4-t8+hX^tk=s

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

가장 골치 아픈 솔루션은 아니지만 "5 * x ^ 2 +/- 4"가 완벽한 제곱인지 직접 확인하는 방법을 사용하고 싶었습니다 .

설명:

2^5*    % 5 times the input squared
4-      % push the above minus 4
t8+     % push the above plus 8 (+4 overall)
hX^     % concatenate them into an array and then take the sqrt().
tk      % push a copy of the array that is rounded using floor().
=       % test if the sqrt's were already integers
s       % sum the results, returns 0 if neither was a perfect square.

노트 :

"0"의 경우 4와 -4가 모두 완전한 정사각형이므로 "1"을 생성하는 1과 동일하므로 "2"를 반환합니다. 0이 아닌 출력은 "truthy"로, 0은 "falsy"로 간주하십시오.




3

자바, 72 69 68 63 59 55 50 49 바이트

n->{int a=0,b=1;for(;a<n;a=b-a)b+=a;return a==n;}

직접 테스트하십시오!

대안 (여전히 49 바이트)

n->{int a=0,b=1;for(;a<n;b=a+(a=b));return a==n;}

독창적이지는 않습니다. 일반 및 기본 반복 버전입니다.

이것은 최대 1,836,311,903 (47 번째 피보나치 수)까지 포함됩니다. 그 이상의 결과는 정의되지 않습니다 (잠재적 인 무한 루프 포함).

골프를 도와 준 Kevin Cruijssen과 David Conrad에게 감사드립니다. :)


1
좋은 접근법. Btw,로 변경 n==0하여 바이트를 골프화 할 수 있습니다 n<1. 문제에서 " 0과 1,000,000,000 사이의 음이 아닌 정수 "라고 표시됩니다.
Kevin Cruijssen 2016 년

1
@KevinCruijssen 나는 그 절로 1이 아니라 5 바이트를 골프 쳤다! :-P 고맙습니다.
Olivier Grégoire

2
피보나치 시퀀스에는 임시 변수가 필요하지 않습니다. 당신과 함께 연속 쌍을 계산할 수 있습니다b+=a;a=b-a;
데이비드 콘래드

1
당신은 블랙 매직, @DavidConrad를하고 있습니다! 말하고 있어요! 마법! :)
Olivier Grégoire

3

C # (. NET 코어) , 51 바이트

bool f(int n,int a=0,int b=1)=>a<n?f(n,b,a+b):a==n;

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

@Oliver 덕분에 -6 바이트!

이 솔루션은 매우 간단한 재귀 함수를 사용합니다.

  • 변수 n는 테스트 할 숫자입니다.
  • 변수 ab시퀀스에서 두 가장 최근의 숫자입니다.
  • 가장 최근 두 숫자 중 첫 번째 숫자가 입력보다 작은 지 확인합니다. 이 경우 시리즈의 다음 번호로 재귀 호출이 이루어집니다.
  • 그렇지 않으면 첫 번째 숫자가 입력과 같은지 확인하고 결과를 반환하십시오.

TIO 링크는 챌린지에 필요한 최대 값을 초과하는 1134903170에서이 작업을 보여줍니다.


그것은 :) 최근에 C #을 솔루션을 참조하는 것이 좋다 - 나는 단순히 여부를 확인 할 수 있다고 생각 a<n을위한 51 바이트
올리버

감사! 그리고 좋은 팁 :)
dana

3

연금술사 , 205 134 바이트

상태를 영리하게 병합 하여 ASCII를 사용 하여 71 바이트를 절약했습니다.

_->In_x+c+u
u+b->u+a+d
u+0b->v
v+c->v+b+d
v+0c->w
w+a+x->w+y
w+0a+0x->Out_"1"
w+a+0x->Out_"0"
w+0a+x+y->w+2x
w+0a+0y+d->w+c
w+0d+0a->u

온라인으로 사용해 보거나 일괄 확인 하십시오 !

언 골프

# read input, initialize (c = 1)
_ -> In_x + c + s0

# a,d <- b
s0 +  b -> s0 + a + d
s0 + 0b -> s1

# b,d <- c
s1 +  c -> s1 + b + d
s1 + 0c -> s2

s2 +  a +  x -> s2 + y            # y <- min(a,x)
s2 + 0a + 0x -> Out_"1"           # if (a == x): was Fibonacci
s2 +  a + 0x -> Out_"0"           # if (a >  x): stop (we exceeded target)
s2 + 0a +  x +  y -> s2 + 2x      # if (a <  x): x += a (since y = a) / restore x
s2 + 0a      + 0y +  d -> s2 + c  # once that's done; c <- d
s2 + 0a           + 0d->s0        # and finally loop


139 . 0비결 정성 비용으로 적은 바이트 수에 대한 일부 검사를 제거 할 수 있습니다
ASCII 전용


@ ASCII-only : 꽤 좋습니다! 그래도 0에 실패하지만 b초기화시
-atom을

2

젤리 , 5 바이트

ȷḶÆḞi

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

피보나치 숫자가 아닌 경우 0을, 피보나치 숫자의 경우 피보나치 수열에서 1의 인덱스 위치를 반환합니다.

설명:

ȷḶÆḞi
ȷ        The literal number 1000
 Ḷ       Range [0,1,...,999]
  ÆḞ     Get the ith Fib number; vectorizes [1,1,2,3,5,...,<1000th Fib number>]
    i    Get the first index of element in list, or 0 if not found

0에서 작동하지 않습니다.
Okx

@ComradeSparklePony 확실합니까? 그것은 나를 위해 작동합니다.
산란

1
0 또는 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875.보다 더 아무것도 작동하지 않습니다
Outgolfer에게 에릭

1
@ Mr.Xcoder 일반적인 합의는 자연 데이터 유형이 지원하는 것을 처리 할 수 ​​있어야하며 Jelly는 임의 정밀도 정수를 지원한다는 것입니다.
Outgolfer Erik

1
26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626.
Erik the Outgolfer


2

R, 43 40 바이트

pryr::f(x%in%DescTools::Fibonacci(0:45))  

pryr::f 함수를 만듭니다.

function (x) 
x %in% DescTools::Fibonacci(0:45)

DescTools::Fibonacci첫 번째 x+1피보나치 수 를 만들고 포함을 확인 하는 데 사용 합니다 . x+1세 번째 fibnum이 2이므로 3의 포함을 확인하기에 충분하지 않기 때문입니다.

운 좋게도 Desctools::Fibonacci(0)=0, 그것은 좋은 프리비입니다.

MickyT 덕분에 -3 바이트


-1:x+1바이트를 절약 할 수는 있지만 0:453을 절약하고 필요한 범위를 커버합니다.
MickyT

@MickyT 아, 필요한 범위 사양을 간과해야합니다. 감사합니다 :)
JAD

36 바이트 만 가능한 대체 방법 : pryr::f(any(!(5*n^2+c(-4,4))^.5%%1)).
rturnbull

32 바이트로 줄 였습니다. 여기를 참조 하십시오 .
rturnbull

코드 골프 규칙에 익숙하지 않습니다. 기본이 아닌 패키지를 허용하는 것이 합리적입니까? 임의의 R 코드를 패키지에 작성하여 설치하고에서 함수를 실행 한 것과 동일한 방식으로 실행할 수 있습니다 pryr.
mb7744

2

하스켈 , 31 바이트

f=0:scanl(+)1f
(`elem`take 45f)

온라인으로 사용해보십시오! 이것은 입력이 0에서 1,000,000,000 범위에있을 것이라는 사실을 이용하므로 처음 45 피보나치 숫자 만 확인하면됩니다. f=0:scanl(+)1f피보나치 수의 무한 목록을 생성 take 45f하고 처음 45 개의 피보나치 수 목록이며 elem입력이이 목록에 있는지 확인합니다.


무제한 버전 : 36 바이트

f=0:scanl(+)1f
g n=n`elem`take(n+3)f

온라인으로 사용해보십시오! 어떤을 위해 n, 처음 복용 n+3피보나치 수열은 그 보장합니다 n는 피보나치 수의 경우이 목록에있을 것입니다.

이 방법은 모든 n+3피보나치 수를 계산해야하기 때문에 피보나치 수가 아닌 높은 수에는 비효율적입니다 .


2

자바 스크립트 (** 연산자가없는 ES6), 44 바이트

f=(x,c=x*(Math.sqrt(5)-1)/2%1)=>x*(c-c*c)<.5

황금 비율에 근접한 연속 피보나치 수의 비율에 의존합니다. c의 값은 입력의 분수 부분을 황금 비율로 나눈 값입니다. 입력이 피보나치 인 경우 이것은 1에 매우 가까우며 c-c²의 값은 매우 작습니다.

다른 JS 답변만큼 짧지는 않지만 O (1) 시간에 실행됩니다.


정확합니까?
user259412 2018 년

피보나치 번호 16558014
Black Owl Kai


2

R, 32 31 바이트

stdin, return TRUE또는 FALSE적절한 입력을받습니다 .

any(!(5*scan()^2+-1:1*4)^.5%%1)

2

공통 리스프, 61 54 바이트

(defun f(x)(do((a 0 b)(b 1(+ a b)))((>= a x)(= a x))))

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

이전 버전에 비해 크기가 줄어 듭니다.

(defun f(x)(do((a 0 b)(b 1 c)(c 1(+ b c)))((>= a x)(= a x))))

피보나치 수의 서열을 생성하기 위해서는 3 개가 아닌 2 개의 변수 만 필요하다는 생각에 의해 유발되었다.


1

Mathematica, 33 바이트

AtomQ@*InverseFunction[Fibonacci]

당신과 바이트의 몇을 절약 할 수 있습니다 @*(다음 마지막 드롭 @#&)
마틴 청산을

1

JS (ES6), 57 바이트

n=>(y=y=>((5*(n**2)+y)**0.5),~~y(4)==y(4)|~~y(-4)==y(-4))

carusocomputing의 방법을 사용합니다 . 내 다른 대답 보다 많은 골퍼 .

언 골프

n=>{
    y=y=>((5*(n**2)+y)**0.5);//carusocomputing's method in a function
    return ~~y(4) === y(4) || ~~y(-4) === y(-4);//~~x === Math.floor(x)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.