피보나치 지수


11

이 문제를 해결하려면 일부 숫자의 합 결과를 출력해야합니다. 이 숫자는 무엇입니까? 글쎄, 당신은 (입력을 주어 a, b정수 (긍정적, 부정적, 또는 영),있는) a != b, 그리고 a < b, 그리고 내 각 정수 ab(이를 포함) 피보나치 수에 따라 지수를해야합니다. 혼란 스럽기 때문에 여기에 예가 있습니다.

Input: (-2, 2)
Output: -2**1 + (-1**1) + 0**2 + 1**3 + 2**5 =
          -2  +    -1   +   0  +   1  +   32 = 30

첫 번째 피보나치 수는로 표시되며 f(0)공식은 다음과 같습니다.

a**f(0) + ... + b**f(b-a+1) 

입력, 처리, 출력

위의 내용을 명확히하기 위해 몇 가지 테스트 사례, 입력 처리 및 예상 출력이 있습니다.

Input: (1, 2)
Processing: 1**1 + 2**1
Output: 3

Input: (4, 8)
Processing: 4**1 + 5**1 + 6**2 + 7**3 + 8**5
Output: 33156

Input: (-1, 2)
Processing: -1**1 + 0**1 + 1**2 + 2**3
Output: 8

Input: (-4, -1)
Processing: -4**1 + -3**1 + -2**2 + -1**3
Output: -4

규칙

  • 표준 허점은 허용되지 않습니다

  • 피보나치 시리즈에 따라 지수가 순서대로 있어야합니다.

  • 위의 테스트 사례에 대해 코드가 작동해야합니다

  • 출력 만 반환하면됩니다

승리 기준

최단 코드 승리!


그래서 0여기에 피보나치 숫자에 포함되지 않는 이유는 무엇입니까?
FlipTack

0은 피보나치 수는 아니지만 입력을위한 올바른 선택입니다.
Anthony Pham

6
33165 또는 33156?
Neil

@Neil 당신이 맞다고 생각합니다
Anthony Pham

위의 "a f (0) + ... + b f (b-a + 1)"는 잘못되었습니다. 예를 들어 a = 1 및 b = 2의 경우 1 f (0) +2 f (2 ). 나는 f (0) + ... + b f (ba); 여기 f (0) = 0 아님 1
RosLuP

답변:


2

05AB1E , 9 바이트

ŸDg!ÅFsmO

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

Ÿ         # Push [a, ..., b].
 Dg!      # Calculate ([a..b].length())! because factorial grows faster than fibbonacci...
    ÅF    # Get Fibonacci numbers up to FACTORIAL([a..b].length()).
      s   # Swap the arguments because the fibb numbers will be longer.
       m  # Vectorized exponentiation, dropping extra numbers of Fibonacci sequence.
        O # Sum.

ab(EG [a..b].length() > 25) 사이의 큰 불일치에 대해서는 TIO에서 작동하지 않습니다 .

그러나 그것은 평균 답변보다 더 큰 숫자로 작동하는 것 같습니다.

그것까지 피보나치 시퀀스를 계산하기 때문에 비효율적는 n!더 답을 계산하는 데 필요한 것보다, 여기서 n의 순서의 길이입니다 a..b.


5

Mathematica, 38 바이트 37 바이트 31 바이트

Sum[x^Fibonacci[x-#+1],{x,##}]&

이것은 단지 rahnema1의 답변으로 Mathematica로 포팅되었습니다. 아래는 내 원래 해결책입니다.

Tr[Range@##^Fibonacci@Range[#2-#+1]]&

설명:

##는 모든 인수의 순서를 #나타내고, 첫 번째 인수를 #2나타내고, 두 번째 인수를 나타냅니다. 두 개의 인수로 호출 할 때 ab, Range[##]목록을 줄 것이다 {a, a+1, ..., b}Range[#2-#+1]같은 길이의 목록을 제공합니다 {1, 2, ..., b-a+1}. 이후 Fibonacci이며 Listable, Fibonacci@Range[#2-#+1]최초의 목록을 줄 것이다 b-a+1피보나치 수 있습니다. Poweris 이므로 Listable동일한 길이의 두 목록에서 호출하면 목록에 스레드됩니다. 그런 다음 Tr합계를 가져옵니다.

편집 : Martin Ender 덕분에 1 바이트가 절약되었습니다.


3
사용할 수 있습니다 Range@##.
Martin Ender 2016

1
지금은 관련이 없지만 원래의 접근 방식을 3 바이트로 향상시킬 수 있습니다 Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin

Range두 번 사용 하는 것은 적기였습니다. 감사!
ngenisis

5

파이썬 , 49 바이트

소요 재귀 람다 ab(당신은 또한 피보나치의 처음 두 숫자를 설정할 수있는 별도의 인수로 x하고 y, 당신이 원하는대로에 - 의도하지,하지만 좋은 기능)

f=lambda a,b,x=1,y=1:a<=b and a**x+f(a+1,b,y,x+y)

온라인으로 사용해보십시오! (테스트 스위트 포함)

골프 제안을 환영합니다.


-~a간단하지 a+1않습니까? -~a기계 의존적 이라고 생각 합니다.
Titus

4

펄 6 , 32 30 바이트

{sum $^a..$^b Z**(1,&[+]...*)}

$^a그리고 $^b함수에 대한 두 가지 주장이다. $^a..$^b행 번호의 범위 $^a$^b의해 지수로 압축하고, Z**피보나치 시퀀스는 1, &[+] ... *.

2 바이트를 줄여준 Brad Gilbert에게 감사합니다.


(1,&[+]...*)1 바이트가 짧고 공백 Z**은 필요하지 않습니다.
브래드 길버트 b2gills

@ BradGilbertb2gills Cool, 나는 피보나치 시퀀스가 ​​그런 식으로 표현 될 수 있다는 것을 몰랐다.
Sean

실제로 &infix:<+>는 0, 1 또는 2 개의 인수를 사용할 수 있기 때문에 작동합니다 . ( &[+]짧은 글쓰기 방법입니다 &infix:<+>). WhateverCode * + *는 정확히 2 개의 인수를 허용합니다. ( &[0]() == 0그래서 1시퀀스를 시작 하려면 거기 에 있어야합니다 )
Brad Gilbert b2gills



3

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

f=(a,b,x=1,y=1)=>a<=b&&a**x+f(a+1,b,y,x+y)

@FlipTack의 탁월한 Python 답변의 간단한 포트.


JavaScript에서 더 짧았습니다. :)
FlipTack

3

하스켈, 35 바이트

f=scanl(+)1(0:f);(?)=sum.zipWith(^)

용법:

$ ghc fibexps.hs -e '[4..8]?f'
33156

o와 같은 함수 를 삽입 연산자로 바꿀 수 있습니다 a#b=sum....
nimi

a… b와 같이 접두사로 간주되었지만 단항 (ℤ, ℤ) → ℕ을 수락하기위한 요구 사항을 읽었습니다
Roman Czyborra

다른 많은 답변은 두 가지 별도의 주장을 취하므로 괜찮습니다.
nimi

이미 ECMAscript7 람다와 비슷한 수준입니다. 우리가 공급을 허용한다면 (a,b)로서 a?b우리는 즉시로 준비 할 수 없습니다 왜 [a..b]?f(?)=sum.zipWith(^)?
로마 Czyborra

나는 이것이 너무 멀리 가고 있다고 생각한다. 입력은 두 개의 숫자 (한 쌍으로 반드시 필요하지는 않지만 두 개의 개별 인수가 수행)이지만 숫자 목록과 함수를 주 함수에 제공합니다.
nimi

2

MATL , 23 바이트

&:ll&Gw-XJq:"yy+]JQ$h^s

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

&:      % Binary range between the two implicit inputs: [a a+1 ... b] 
ll      % Push 1, 1. These are the first two Fibonacci numbers
&G      % Push a, b again
w-      % Swap, subtract: gives b-a
XJ      % Copy to cilipboard J
q:      % Array [1 2 ... b-a-1]
"       % For each (repeat b-a-1 times)
  yy    %    Duplicate the top two numbers in the stack
  +     %    Add
]       % End
J       % Push b-a
Q       % Add 1: gives b-a+1
$       % Specify that the next function takes b-a+1 inputs
h       % Concatenate that many elements (Fibonacci numbers) into a row vector
^       % Power, element-wise: each entry in [a a+1 ... b] is raised to the
        % corresponding Fibonacci number
s       % Sum of array. Implicitly display

1

R, 51 바이트

익명의 기능.

function(a,b)sum((a:b)^numbers::fibonacci(b-a+1,T))


0

루비, 46 바이트

->a,b{n=s=0;m=1;a.upto(b){|x|s+=x**n=m+m=n};s}

여기서 볼만한 영리하거나 독창적 인 것은 없습니다. 죄송합니다.


나에게 Ruby를 말하는 사람이 아니라면,이 ℤ.upto(ℤ)방법은 Ruby의 모든 객체 행동의 아름다움을 상기시켜줍니다. 코드를 더 골프화하는 것은 네이티브 루비 스피커에게 연습으로 남겨둔다. codegolf.stackexchange.com/questions/363/… 을 스캔 했습니까 ?
로마 Czyborra

0

자바 7, 96 바이트

골프 :

int n(int a, int b){int x=1,y=1,z=0,s=0;while(a<=b){s+=Math.pow(a++,x);z=x+y;x=y;y=z;}return s;}

언 골프 드 :

int n(int a, int b)
{
    int x = 1, y = 1, z = 0, s = 0;
    while (a <= b)
    {
        s += Math.pow(a++, x);
        z = x + y;
        x = y;
        y = z;
    }

    return s;
}

0

R, 57 바이트

x=scan();sum((x[1]:x[2])^numbers::fibonacci(diff(x)+1,T))

꽤 직설적 인. gmp::fibnum짧은이 내장되어 있지만까지 전체 시퀀스 반환을 지원하지 않습니다 n, numbers::fibonacci인수를 추가하여 수행을 T.

먼저이 솔루션 gmp::fibnum보다 2 바이트 더 긴 더 까다로운 솔루션이있었습니다 .

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F

익명 함수를 사용 scan()하면 6 바이트 가 절약됩니다. 게시 된 솔루션을 참조하십시오.
rturnbull

아 그래, 바보 야
JAD

0

dc , 56 바이트

?sf?sa0dsbsg1sc[lblcdlfrdsb^lg+sg+sclf1+dsfla!<d]dsdxlgp

[1,30]51 초 안에 입력이 완료됩니다 . 한 번 실행 된 두 개의 개별 행에 두 개의 입력을 사용하고 대시 대신 밑줄 ( _)을 앞에두고 음수를 -4입력합니다 (예 : 로 입력 _4).


0

PHP, 77 75 바이트

for($b=$argv[$$x=1];$b<=$argv[2];${$x=!$x}=${""}+${1})$s+=$b++**$$x;echo$s;

명령 행 인수에서 경계를 가져옵니다. 로 실행하십시오 -nr.
PHP의 변수 변수를 다시 보여주기 (그리고 내가 찾은 것) .

고장

for($b=$argv[$$x=0}=1]; # $"" to 1st Fibonacci and base to 1st argument
    $b<=$argv[2];           # loop $b up to argument2 inclusive
    ${$x=!$x}                   # 5. toggle $x,             6. store to $1/$""
        =${""}+${1}             # 4. compute next Fibonacci number
)
    $s+=$b++**                  # 2. add exponential to sum,    3. post-increment base
        $$x;                    # 1. take current Fibonacci from $""/$1 as exponent
echo$s;                     # print result

PHP로 포팅 된 FlipTack의 답변 은 70 바이트입니다.

function f($a,$b,$x=1,$y=1){return$a>$b?0:$a**$x+f($a+1,$b,$y,$x+$y);}

0

공리, 65 바이트

f(a,b)==reduce(+,[i^fibonacci(j)for i in a..b for j in 1..b-a+1])

테스트 코드 및 결과

(74) -> f(1,2)
   (74)  3
                                                   Type: Fraction Integer
(75) -> f(4,8)
   (75)  33156
                                                   Type: Fraction Integer
(76) -> f(-1,2)
   (76)  8
                                                   Type: Fraction Integer
(77) -> f(-4,-1)
   (77)  - 4
                                                   Type: Fraction Integer
(78) -> f(3,1)
   >> Error detected within library code:
   reducing over an empty list needs the 3 argument form
    protected-symbol-warn called with (NIL)

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