피보나치 같은 시퀀스에서 가장 낮은 초기 숫자


22

양의 정수 입력 N이 주어지면 두 개의 음이 아닌 숫자 ab를 출력합니다 . 여기서 a <b , 가능한 가장 낮은 평균값으로 숫자 N 이 되풀이 관계 시퀀스의 일부가됩니다.

f(0) = a
f(1) = b
f(n) = f(n-2)+f(n-1)

경우에는 평균 이상의 용액있다 및 B는 다음으로, 최소화는 출력해야 최저로 한 B .

N 이 언어 / 시스템에서 대표적인 정수 범위 내에 있다고 가정 할 수 있습니다 .

테스트 사례

N = 1
a = 0, b = 1

N = 15
a = 0, b = 3

N = 21
a = 0, b = 1

N = 27
a = 0, b = 9   <- Tricky test case. [3, 7] is not optimal and [4, 3] is not valid

N = 100
a = 4, b = 10

N = 101
a = 1, b = 12

N = 102
a = 0, b = 3

N = 1000
a = 2, b = 10

만약 a>=0a<b이제까지 여러 솔루션이 있습니까?
Jonathan Allan

여러 솔루션이 있는지 또는 보장하지는 않습니다. 모두 1,42,3줄 것이다 5, 그들은 같은 의미를 가지고있다. 가장 낮은 평균값 인 경우와 유사한 사례를 찾을 수 있다고 생각합니다. 여러 솔루션이 없음을 표시 / 증명할 수 있으면 해당 상태를 확인할 필요가 없습니다.
Stewie Griffin


3
가능한 가장 낮은 평균 인 A249783에 해당하는 OEIS 시퀀스 에는 와일드 한 그래프가 있습니다.
피터 카게이

1
@ ØrjanJohansen 중복 답변이 없다는 답변을 내 답변에 추가했습니다 (내 답변이 그것에 의존하기 때문에).
cardboard_box

답변:


8

껍질 , 19 18 16 14 13 15 바이트

1 바이트를 절약 해 준 Zgarb에게 감사드립니다.

ḟö£⁰ƒẊ++ÖΣṖ2Θḣ⁰

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

설명:

면책 조항 : 실제로 ȯƒẊ++코드 섹션을 이해하지 못합니다 .

편집 : Haskell로 번역 된 것으로 보입니다 fix.(mapad2(+).).(++). 여기서 mapad2목록의 모든 인접한 쌍에 적용 기능이 있습니다. (허 스크를 알고 있지만이 프로그램과 관련하여 다른 의미가있을 수 있습니다)

            Θḣ⁰    Create the list [0..input]
          Ṗ2       Generate all possible sublists of length 2
        ÖΣ         Sort them on their sums
ḟ                  Find the first element that satisfies the following predicate.
    ƒẊ++             Given [a,b], magically generate the infinite Fibonacci-like
                     sequence from [a,b] without [a,b] at the start.
 ö£⁰                 Is the input in that list (given that it is in sorted order)?


나는 그것을 시도 확신합니다 ...
H.PWiz

8

자바 스크립트 (Node.js) , 92 90 89 91 83 82 bytes

ThePirateBay 덕분에 -3 바이트 -1 바이트

Neil 덕분에 -8 -9 바이트.

f=(n,a=1,b=0,c=(a,b)=>b<n?c(a+b,a):b>n)=>c(a,b)?b+2<a?f(n,a-1,b+1):f(n,b-~a):[b,a]

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

참고 :이 솔루션은 여러 개의 최소 솔루션이 없다는 사실에 의존합니다.

여러 솔루션이 없다는 증거 :

하자 FIB(a,b,k)로 시작하는 피보나치 같은 순서 수 a,b:

FIB(a,b,0) = a
FIB(a,b,1) = b
FIB(a,b,k) = FIB(a,b,k-1) + FIB(a,b,k-2)

렘마 1

피보나치 유사 서열의 차이는 그 자체가 피보나치 유사 FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)이다. 증거는 독자에게 맡겨져 있습니다.

렘마 2

의 경우 다음을 만족 n >= 5하는 솔루션 a,b이 있습니다 a+b < n.

경우 n도있다FIB(0,n/2,3) = n

이 경우 n, 홀수FIB(1,(n-1)/2,3) = n

증명

n < 5철저하게 확인할 수있는 사례 .

우리가이 개 최소한의 솔루션을 가지고 가정 n >= 5, a0,b0그리고 a1,b1함께 a0 + b0 = a1 + b1하고 a0 != a1.

그런 존재 k0,k1가 같은 FIB(a0,b0,k0) = FIB(a1,b1,k1) = n.

  • 사례 1 : k0 = k1

    가정 WLOG b0 < b1(따라서 a0 > a1)

    하자 DIFF(k)의 차이점 할 것을 Fibonnaci-등으로 시작하는 시퀀스 a1,b1a0,b0:

    DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k) (레마 1)

    DIFF(0) = a1 - a0 < 0

    DIFF(1) = b1 - b0 > 0

    DIFF(2) = (a1+b1) - (a0+b0) = 0

    DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0

    DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0

    피보나치 유사 서열에 2 개의 긍정적 인 용어가 있으면 모든 후속 용어는 긍정적입니다.

    따라서 유일한 시간 DIFF(k) = 0은 언제 k = 2이므로 유일한 선택은 k0 = k1입니다 2.

    따라서 n = FIB(a0,b0,2) = a0 + b0 = a1 + b1

    이 솔루션의 최소 성은 Lemma 2와 모순됩니다.

  • 사례 2 : k0 != k1:

    WLOG는 가정 k0 < k1합니다.

    우리는 FIB(a1,b1,k1) = n

    방해 a2 = FIB(a1,b1,k1-k0)

    방해 b2 = FIB(a1,b1,k1-k0+1)

    그런 다음 FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)(독자 운동)

    FIB(a1,b1,k)대해 음수 k >= 0가 아니므로 감소하지 않습니다.

    이것은 우리를 제공 a2 >= b1 > a0하고 b2 >= a1+b1 = a0+b0.

    그럼 DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)(Lemma 1)

    DIFF(0) = a2 - a0 > 0

    DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0

    DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0

    DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0

    다시 한번, DIFF2 개의 긍정적 인 용어가 있으므로 모든 후속 용어는 긍정적입니다.

    따라서 가능한 유일한 시간 DIFF(k) = 0k = 1이므로 유일한 선택은 k0입니다 1.

    FIB(a0,b0,1) = n

    b0 = n

    이것은 Lemma 2와 모순됩니다.




@Neil 최소화하는 b대신 최소화 a+b하므로 솔루션은 제공 f(27) = [3,7]하지만 최적의 솔루션은 제공 f(27)=[0,9]합니다. 주요 변경 사항을 되 돌리면 83 바이트로 줄어 듭니다.
cardboard_box

1
b-~a대신을 사용하여 다른 바이트를 저장할 수 있다고 생각합니다 a+b+1.
Neil

1
두 번째 경우에 작은 오류가있다 : a2 >= a1 + b1때 올바르지 않습니다 k1-k0=1. 대신 사용할 수 있습니다 a2 >= b1 > a0b2 >= a1+b1 = a0+b0다음 나머지는 다음과 같습니다.
Ørjan Johansen '11

8

하스켈 , 76 72 74 바이트

편집하다:

  • -4 바이트 : @ H.PWiz는을 /대신 사용하도록 제안 div했지만 분수 형식을 사용해야합니다.
  • +2 바이트 : Enum을 추가 하여 범위 관련 버그를 수정했습니다 -1.

fDouble또는 Rational유형을 가져와 동일한 튜플을 반환합니다. 이론적으로 무제한 Double이지만 반올림 오류를 일으킬만큼 크지 않은 모든 값에 충분합니다 Rational.

f n|let a?b=b==n||b<n&&b?(a+b)=[(a,s-a)|s<-[1..],a<-[0..s/2-1],a?(s-a)]!!0

온라인으로 사용해보십시오! ( Rational정수 형식의 입출력에 대한 H.PWiz의 헤더 조정 )

작동 원리

  • ?의 범위에 로컬로 중첩 된 연산자입니다 f. 까지 a?b시작하여 a,b까지 정확하게 피보나치와 같은 시퀀스를 반복적으로 반복하여 정확하게 맞으면 b>=n리턴 합니다.Truen
  • 목록 이해에서 :
    • s모든 숫자를 반복 1의 합을 나타내는 위쪽, ab.
    • a에서까지의 숫자를 반복 0합니다 s/2-1. (경우 s범위 라운드까지의 단부 홀수).
    • a?(s-a)시퀀스가 a,s-ahits로 시작하는지 테스트합니다 n. 그렇다면 목록 이해에는 튜플이 포함됩니다 (a,s-a). (이것은 b=s-a명명하기에 너무 짧았음에도 불구하고입니다.)
    • !!0 이해의 첫 번째 요소 (적중)를 선택합니다.

8

APL (Dyalog) , 75 71 64 59 53 48 44 43 바이트

@ Adám 덕분에 2 바이트 절약

@ngn 덕분에 12 바이트 절약

o/⍨k∊¨+\∘⌽⍣{k≤⊃⍺}¨oa/⍨</¨a←,⍉|-21+k←⎕

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

사용합니다 ⎕IO←0.

방법? 이건 정말 미쳤어

k←⎕ -입력을 할당 k

⍳2⍴1+k←⎕- 범위의 직교 제품 0k자체

|-\¨ -왼쪽에서 각 오른쪽 쌍 요소를 빼고 절대 값을 얻습니다.

a←,⍉ -전치, 편 평화 및 할당 a

o←a/⍨</¨a -왼쪽 요소가 오른쪽보다 작은 쌍만 유지하고 o

o이제와의 모든 쌍의 목록을 포함하며 a < b, 산술 평균으로 정렬됩니다.

+\∘⌽⍣{k≤⊃⍺}¨o- 각 쌍에 대해 o, 피보나치까지 (cumsum 쌍 및 역방향) 적용 k이상의 기간에 도달

k∊¨- k이 마지막 용어 인지 결정 하십시오 (시퀀스에 포함되어 있음을 의미)

o/⍨- o이전 수표가 적용되는 곳에 쌍을 유지

-첫 번째 결과를 반환합니다.


5

파이썬 (2) , 127 (109) 107 바이트

-2 OVS 덕분 바이트 (변화 and*)

g=lambda x,a,b:a<=b<x and g(x,b,a+b)or b==x
f=lambda n,s=1,a=0:g(n,a,s-a)*(a,s-a)or f(n,s+(a==s),a%s+(a<s))

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

에 대한 보너스 포인트는 n,a,s-a?

설명:

  • 첫 번째 줄은 재귀 람다를 선언하며 , 피보나치 시퀀스가 ​​확장 g될지 여부를 확인합니다 . 또한 질문의 기준 중 하나임을 확인합니다 . (이 경우을 허용 하지만 이러한 경우 이미 발견되어 반환 된 경우). a, bxa <= ba == b0, a
    • 연쇄 불평등 a<=b<x은 두 가지 편리한 작업을 한 번에 수행 a <= b합니다 b < x.
    • 경우 b < x수율 True, 함수는 피보나치 시퀀스에서 다음 두 숫자 다시 자신을 호출합니다 b, a+b. 이것은 함수가 다음과 같은 때까지 계속해서 새로운 용어를 연습한다는 것을 의미합니다.
    • b < x수익률 이라면 False, 우리가 점검해야 할 시점에 도달 한 것 b==x입니다. 그렇다면이 값이 반환 True되어 초기 쌍이 a, b결국에 도달 함을 나타 x냅니다. 그렇지 않으면 인 경우 b > x쌍이 유효하지 않습니다.
  • 두 번째 줄은 또 다른 재귀 적 람다를 선언 f하는데, 이는 주어진 값에 대한 해를 찾는다 n. yield가 a, b나올 때까지 새로운 초기 쌍을 재귀 적으로 시도합니다 . 그런 다음이 솔루션이 반환됩니다. g(n, a, b)True
    • 이 함수는 두 개의 변수 s(초기 1)와 a(초기 0)를 사용하여 초기 피보나치 쌍을 재귀 적으로 계산합니다 . 각 반복에서 a증분 a, s-a되고 첫 번째 쌍으로 사용됩니다. 그러나, a히트 s, 그것은 0으로 다시 돌아, 그리고 s증가한다. 이는 쌍이 다음 패턴으로 계산됨을 의미합니다.
      s = 1 (0, 1) (1, 0)
      s = 2 (0, 2) (1, 1) (2, 0)
      s = 3 (0, 3) (1, 2), (2, 1), (3, 0)
      
      분명히 여기에는 일부 유효하지 않은 쌍이 포함되어 있지만 전달 될 때 즉시 제거됩니다 g(첫 번째 글 머리 기호 참조).
    • 때의 값 as같은 것을 발견되고 g(n, a, s-a) == True,이 값이 반환된다. 가능한 솔루션이 '크기'(평균, 최소값으로 정렬 됨) 순서로 계산되므로 챌린지 요청에 따라 첫 번째 솔루션이 항상 가장 작습니다.

3

R , 183 바이트 160 바이트

n=scan();e=expand.grid(n:0,n:0);e=e[e[,2]>e[,1],];r=e[mapply(h<-function(n,a,b,r=a+b)switch(sign(n-r)+2,F,T,h(n,b,r)),n,e[,1],e[,2]),];r[which.min(rowSums(r)),]

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

23 바이트를 골라 낸 Giuseppe에게 감사드립니다.

코드 설명

n=scan()                        #STDIO input
e=expand.grid(n:0,n:0)          #full outer join of integer vector n to 0
e=e[e[,2]>e[,1],]               #filter so b > a
r=e[mapply(
  h<-function(n,a,b,r=a+b)switch(sign(n-r)+2,F,T,h(n,b,r)),
                                #create a named recursive function mid-call 
                                #(requires using <- vs = to denote local variable creation 
                                #rather than argument assignment
  n,e[,1],e[,2]),]              #map n, a and b to h() which returns a logical
                                #which is used to filter the possibilities
r[which.min(rowSums(r)),]       #calculate sum for each possibility, 
                                #get index of the minimum and return
                                #because each possibility has 2 values, the mean and 
                                #sum will sort identically.

1
160 바이트 -일반적으로 가능한 한 바이트를 저장해야하므로 멋진 이름 지정을 제거하여 4 바이트를 절약하는 것은 허용되거나 권장 될뿐만 아니라 code-golf에 필요한 의미 입니다. 그럼에도 불구하고 좋은 대답, +1.
주세페


1

젤리 , 19 바이트

ṫ-Sṭµ¡³e
0rŒcÇÐfSÐṂ

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

-1 바이트 감사 증거 에 의해 cardboard_box . 그것이 반증되는 경우 UṂṚ총 22 바이트의 두 번째 줄 끝에 추가 할 수 있습니다 .


... 가장 증가하면 @StewieGriffin의 관찰이 해결되어야합니다.
Jonathan Allan

나는 예감 한 사용자가 삭제할 수 있습니다
조나단 앨런

1
입력을 x최신 상태로 만드는 시드 만 찾으면 됩니다. 경우 x 복수의 세 번째 인덱스에 발견 그것은 작동0,x 하기 때문에 또한 하나의 작업 것이다 1,(x-1)/2( x홀수) 또는 2,x/2-1( x도)으로 가는데, x그렇게 못해, 그래서 결과 이후에 나타납니다. 이후 충돌의 경우 평균은 세 번째 항이 동일 할 경우에만 동일 할 수 있지만 초기 항 (차가 같을 수도 있음) 사이의 차이가 더 낮아야하므로 x이후의 지수에서 발견됩니다. . 따라서 ṫ-Sṭµ¡i³¶ḶŒcÇÐṀ4 바이트를 절약 할 수 있습니다 .
Jonathan Allan


@StewieGriffin 내가 대답했을 때 테스트 사례가 존재하지 않았습니다 : p
Outgolfer Erik

1

GolfScript - 88 77 바이트

~:N[,{1+:a,{[.;a]}/}/][{[.~{.N<}{.@+}while\;N=]}/]{)1=\;},{(\;~+}$(\;);~~' '\

cardboard_box 덕분에 여러 솔루션을 확인하지 않았습니다!

설명

~:N                           # Reads input
[,{1+:a,{[.;a]}/}/]           # Creates an array of pairs [a b]
[{[.~{.N<}{.@+}while\;N=]}/]  # Compute solutions
{)1=\;},         # Pairs that are not solutions are discarded
{(\;~+}$         # Sorts by mean
(\;);~~' '\      # Formats output


0

배치, (160) 158 바이트

@set/aa=b=0
:g
@if %a% geq %b% set/ab-=~a,a=0
@set/ac=a,d=b
:l
@if %c% lss %1 set/ad+=c,c=d-c&goto l
@if %c% gtr %1 set/aa+=1,b-=1&goto g
@echo %a% %b%

이것 또한 3 7입력을 제공 합니다 27. 올바른 해결책은 0 9입니다.
cardboard_box

@cardboard_box 아직도 질문이 필요한 부분을 보지 못했습니다 ...
Neil

첫 번째 문장에서 : "가장 낮은 평균값".
cardboard_box

@cardboard_box 아 죄송합니다. 간과하기가 너무 쉬웠습니다.
Neil

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