n 번째 피보나치 수를 포함하는 n 번째 피보나치 수를 인쇄하십시오!


22

도전

양의 정수 n를 입력으로 사용하고 n하위 Fib #을 포함하는 Fibonacci 번호 (전체 Fib #로 단축)를 출력 하는 프로그램을 작성해야합니다 n. 이 도전의 목적을 위해 피보나치 수열은로 시작합니다 1.

다음은 테스트 케이스 또는 챌린지를 명확히하기위한 예제로 사용할 수있는 몇 가지 예입니다 (후자는 명확하지 않은 것을 설명하는 아래에 주석을 남겨주세요).

n=1
Fib#s: 1
       ^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1

n=2
Fib#s: 1, 1
       ^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1

n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
             ^1              ^2                   ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233

n=4
Output: 233

n=5
Output: 6765

n=6
Output: 28657

n=7
Output: 1304969544928657

n=8
Output: 14472334024676221

n=9
Output: 23416728348467685

n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
                   ^1                     ^2         ^3                                   ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309

항상 그렇듯이 이것은 이므로 가능한 가장 적은 바이트 수로 이동하십시오.

혼란 스럽거나 불분명 한 내용이 있으면 의견을 남겨주십시오.

(이 문제는 내가 게시 된 또 다른 도전 기반으로한다 : N 포함하는 n 번째 주요 인쇄 )


3
n=5테스트 케이스를 포함시키는 것이 좋습니다 . 왜냐하면 하위 문자열이 여러 번있는 경우 수를 세는 수표를 작성하는 바보 같은 오류가 발생했기 때문입니다. n=5때문에 그것을 잡을 것입니다 55.
Ørjan Johansen 2016

2
@officialaimm 매우 높은 숫자를 기대하는 것이 합리적이라고 생각하지 않습니다. 내 솔루션은 최대 TIO n=25(출력 1186 자리)에서 작동 한 다음 n=26(내 랩톱에서 컴파일 된 3085 자리) 사망합니다 . fib(n)하나 이상의 숫자를 얻을 때마다 어려움이있는 것처럼 보입니다 (예상 한대로). 다음 점프 인 31은 최종 출력에서 ​​12990 자리를가집니다.
Ørjan Johansen 2016

1
예. 롤! 루프에서 여러 번 호출되는 재귀 함수가 있기 때문에 내 파이썬 솔루션은 n> 6에 붙어 있습니다. : D
officialaimm

1
@officialaimm 아, 기하 급수적으로 폭발은 피보나치를 재귀와 함께 직접 정의 할 때 문제가됩니다. 그럼에도 불구하고 파이썬의 재귀 한계에 곧 도달 할 수 있습니다.
Ørjan Johansen

1
@Shaggy : 이것이 일관성있는 의미입니다. 0이 0 번째 피보나치 수이면 1은 첫 번째 ( "1 번째"?) 피보나치 수입니다.
ShreevatsaR

답변:


12

하스켈 , 85 84 바이트

편집하다:

  • -1 바이트 : Laikoni 단축 l.
  • (오타 x>=s에 대한 x<=s설명에서).

f를 가져와 a Int를 반환합니다 String.

l=0:scanl(+)1l
m=show<$>l
f n|x<-m!!n=[y|y<-x:m,or[x<=s|s<-scanr(:)""y,x++":">s]]!!n

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

작동 원리

  • l는 피보나치 수의 무한 목록으로, 부분 합으로 재귀 적으로 정의됩니다 0:1:l. 0목록은 색인이 0이므로 시작합니다 . m문자열로 변환 된 동일한 목록입니다.
  • 에서 f:
    • n입력 번호이고 피보나치 수 x의 (문자열)입니다 n.
    • 외부 목록 이해에서 y피보나치 수 x는 부분 문자열로 포함되는지 여부를 테스트합니다 . 통과하는 ys가 목록에서 수집되고 최종 !!n으로 색인되어 출력됩니다. 추가 x!!(n-1)끝에 사용하여 2 바이트를 절약하기 위해 테스트 앞에 추가됩니다 .
    • y여러 번 계산을 피하기 위해 각각의 테스트 y는 래핑 or되고 다른 목록 이해가 이루어집니다.
    • 내부 목록 이해 s에서 접미사를 반복합니다 y.
    • x의 접두사 인지 테스트하기 위해 and를 s검사합니다 . ( 약간 임의적이지만 숫자보다 커야합니다.)x<=sx++":">s":"

1
l=0:scanl(+)1l바이트를 저장합니다.
Laikoni


4

파이썬 2 , 99 86 바이트

  • Ørjan Johansen 7 바이트 저장 : 시작 b=i=x=-1 a=1및 삭제x and
  • Ørjan Johansen은 다시 3 바이트를 저장 f and n==2했습니다.f*(n>2)
  • Felipe Nardi Batista, 9 바이트 절약 : 경제 스왑 a,b=a+b,a속기 f-=str(x)in str(a), 압착(n<2)*f
  • ovs는 13 바이트를 절약했습니다 : python 3에서 python 2 로의 전환.
f=n=input()
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=`x`in`a`
print a

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

설명:

f=n=int(input())                 # f is number of required numbers

b=i=x=-1                         # i is index(counter) set at -1
                                 # In Two-sided fibonacci, fib(-1) is 1 
                                 # and b(fib before it) i.e. fib(-2) is -1
                                 # Taking advantage of all -1 values, x is 
                                 # also set to -1 so that the `if str(...`
                                 # portion does not execute until x is set a 
                                 # value(i.e. the nth fibonacci) since there 
                                 # is no way -1 will be found in the number 
                                 # (ALL HAIL to Orjan's Genius Idea of using 
                                 # two-sided fibonacci)      

a=1                              # fib(-1) is 1


while(n>2)*f:                    # no need to perform this loop for n=1 and 
                                 # n=2 and must stop when f is 0

 i+=1                            # increment counter

 b,a=a,a+b                       # this might be very familiar (fibonacci 
                                 # thing ;))                         

 x=[x,a][i==n]                   # If we have found (`i==n`) the nth 
                                 # fibonacci set x to it

 f-=`x`in`a`                     # the number with required substring is 
                                 # found, decrease value of f

print a                          # print required value

파이썬 (3) , 126 (120) 113 (112) 110 (101) 99 바이트

f=n=int(input())
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=str(x)in str(a)
print(a)

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


1
로 시작 b=i=x=-1 a=1하고 삭제하여 7 바이트를 더 제거 할 수 있습니다 x and . (본질적으로 양면 피보나치 시퀀스 -1, 1, 0, 1, 1, 2, ..., 3 단계에 앞서 시작)
Ørjan 요한센

1
당신은 -1: P
Ørjan Johansen 님이

1
홍당무 . 또한`와 n> 2를 제거하고 싶지만 n==2실제로는 특별한 치료가 필요한 것 같습니다 . 그러나 단축 될 수 있습니다 *(n>2).
Ørjan Johansen 2016

1
그것은 88 바이트 로 골프를 쳤지 만 , 일부 변경 사항은 파이썬 2에서만 독점적이지만 나머지는 파이썬 3에서도 작동합니다.
Felipe Nardi Batista

1
파이썬 3, 당신은 여전히 골프 9 바이트 수 : 여기
펠리페 나르디 바티스타

4

자바, 118 111 바이트

i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}

피보나치 비트를 복제하지 않는 것이 가능해야한다고 생각하지만 모든 노력으로 인해 더 많은 바이트가 생성됩니다.

개선을위한 Kevin에게 감사드립니다 ... 골프에 대한 첫 번째 시도라고 생각합니다 :)


2
스 니펫은 허용되지 않습니다. 이것을 다음과 같이 람다로 바꿔야합니다. i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}(118 바이트)
Okx

1
PPCG에 오신 것을 환영합니다! @Okx가 지적했듯이 람다로 변경 한 후에는 인상적인 답변이라고 말해야합니다. 나는 점심 식사 직전에 약 한 시간 전에이 도전을 시도하고 포기했습니다. 나에게서 +1. 골프에 일부 작은 것들 : while(--n>0){q=p;p=c;c+=q;}될 수 있습니다 for(;--n>0;p=c,c+=q)q=p;n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}수 있습니다 for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (전체 : i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}( 111 bytes )
Kevin Cruijssen 2016 년

2

펄 6 , 45 바이트

{my@f=0,1,*+*...*;@f.grep(/$(@f[$_])/)[$_-1]}

$_함수에 대한 인수입니다. @f느리게 생성 된 피보나치 수열입니다.


2

자바 스크립트 (ES6), 96 93 92 90 86 바이트

0의 색인을 생성하며 시퀀스의 0 번째 숫자는 1입니다. 에서 크랩합니다 14.

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
  • Arnauld 덕분에 2 6 바이트 절약

시도 해봐

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
oninput=_=>o.innerText=(v=+i.value)<14?`f(${v}) = ${f(v)}\ng(${v}) = `+g(v):"Does not compute!"
o.innerText=`f(0) = ${f(i.value=0)}\ng(0) = `+g(0)
<input id=i min=0 type=number><pre id=o>


설명

잠시 후에 업데이트 할 버전이 업데이트되었습니다.

f=...                   :Just the standard, recursive JS function for generating the nth Fibonacci number
g=(...)=>               :Recursive function with the following parameters.
n                       :  The input integer.
x=0                     :  Used to count the number of matches we've found.
y=0                     :  Incremented on each pass and used to generate the yth Fibonacci number.
x>n?                    :If the count of matches is greater than the input then
f(y-1)                  :    Output the y-1th Fibonacci number.
:                       :Else
g(...)                  :    Call the function again, with the following arguments.
n                       :      The input integer.
x+                      :      The total number of matches so far incremented by the result of...
RegExp(f(n)).test(f(y)) :        A RegEx test checking if the yth Fibonacci number, cast to a string, contains the nth Fibonacci number.
                        :        (returns true or false which are cast to 1 and 0 by the addition operator)
y+1                     :      The loop counter incremented by 1

귀하의 답변은 예제와 다른 결과를 제공하는 것 같습니다.
ericw31415

@ ericw31415, 그것은 인덱스가 0이기 때문입니다.
얽히고 설킨

"하지만이 도전의 목적을 위해 피보나치 수열은 1로 시작합니다."
ericw31415 2018 년

@ ericw31415 : 그리고 내 시퀀스는 1로 시작합니다 .0 인덱스입니다. 시퀀스의 0 번째와 1 번째 숫자는 1, 2 번째는 2, 3 번째는 3, 4 번째는 5, 5 번째는 8 등입니다.
얽히고 설킨

2

, 65 바이트

AIθνAνφA±¹βAβιAβξA¹αW∧›ν²φ«A⁺ι¹ιA⁺αβχAαβAχαA⎇⁼ιναξξA⁻φ›№IαIξ⁰φ»Iα

온라인으로 사용해보십시오! 자세한 설명을 위해 자세한 코드로 연결하십시오.



1

수학, 85 바이트

(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&

입력

[10]

@JungHwan Min에서 -4 바이트

산출

4660046610375530309


2
이상하게 보이지만 f@i@n++완전히 유효하여 1 바이트를 줄입니다. For대신에 사용 While하면 3 바이트 가 줄어 듭니다. 85 바이트 :(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min


1

R, 77 72 바이트

F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)

이것은 gmp피보나치 수 에 대한 라이브러리를 사용합니다. 질문을 상당히 솔직하게 이행합니다.

F=gmp::fibnum;          # Alias Fibonacci function to F
i=0;                    # intitalise counter
d=n=scan();             # get n assign to d as well
while(n)               # loop while n
  if(grepl(F(d),F(i<-i+1)))  # use grepl to determine if Fib of input is in Fib# and increment i
     n=n-1;             # decrement n
F(i)                  # output result

일부 테스트

> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 2
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 3
2: 
Read 1 item
Big Integer ('bigz') :
[1] 233
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 10
2: 
Read 1 item
Big Integer ('bigz') :
[1] 4660046610375530309
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 15
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1387277127804783827114186103186246392258450358171783690079918032136025225954602593712568353

0

클로저, 99 바이트

(def s(lazy-cat[0 1](map +(rest s)s)))#(nth(filter(fn[i](.contains(str i)(str(nth s %))))s)(dec %))

기본 솔루션은 무한한 피보나치 수열을 사용합니다 s.


0

C #, 35 바이트

int u=1,b=1;for(;b<n;){b+=u;u=b-u;}

시도 해봐

int n=int.Parse(t2.Text);int u=1,b=1;for(;b<n;){b+=u;u=b-u;t.Text+=b.ToString()+" ";}if(b==n){t.Text+="true";}

1
Programming Puzzle 및 Code-Golf에 오신 것을 환영합니다. 답변은 전체 프로그램 또는 함수 여야하며 스 니펫 만 제공해야합니다. 특히, 당신은 입력이 있다고 가정 n하고 출력을 넣습니다 b(제 생각에). 당신은 그것을 n인수와 반환으로 쓸 수 있습니다 b... 또한, 나는 당신이 도전이 요구하는 것을 계산하지 않고 있다고 확신합니다. 실제로, 나는 당신이 무엇을 계산하는지 전혀 모른다. 솔루션을 확인하기 위해 실행할 수있는 코드를 제공해 주시겠습니까? (귀하의 "시도"는 그대로 실행할 수 없습니다.)
Dada

0

NewStack , 14 바이트

N∞ ḟᵢfi 'fif Ṗf⁻

고장 :

N∞              Add all natural numbers to the stack
   ḟᵢ           Define new function will value of input
     fi          Get the n'th Fibonacci number for ever element n
       'fif      Remove all elements that don't contain the (input)'th Fibonacci number 
           Ṗf⁻  Print the (input-1)'th element

영어로 : (입력 예 3)

N∞: 자연수 목록을 만듭니다. [1,2,3,4,5,6...]

ḟᵢ: 입력을 변수에 저장 f [1,2,3,4,5,6...]

: 목록을 피보나치 숫자로 변환 [1,1,2,3,5,8...]

'fif: 포함하는 모든 요소를 ​​유지 f 피보나치 수[2,21,233...]

Ṗf⁻: f-1th 요소를 인쇄합니다 (0 기반 색인으로 인해 -1).233


GitHub에는 readme와 튜토리얼 만있는 것 같습니다. 구현이 참조되었지만 연결되지 않았습니다. PPCG는 이제 도전 과제보다 새로운 언어를 허용하지만 공개적으로 사용 가능한 구현이 여전히 필요하다고 생각합니다.
Ørjan Johansen 2016

@ ØrjanJohansen, 아아 나에게 상기시켜 주셔서 감사합니다. 나는 그것을 업로드하는 것을 잊었다! 1 분 안에 올거야.
Graviton

구현시 UTF-8을 사용하는 것 같습니다.이 경우 실제로 28 바이트입니다 (하스켈 설정에 신경 쓰지 말고 바이트 수를 계산하기 위해 TIO 만 사용하고 있습니다). Jelly와 같은 언어에는 이러한 이유로 자체 코드 페이지가 있습니다.
Ørjan Johansen 2016

@ ØrjanJohansen Touché, 우리가 말하는 것처럼 테이블을 자체 인코딩으로 배포하는 작업에 있습니다.
Graviton

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