Expoentes de Fibonacci

11

Para esse desafio, você deve exibir o resultado da soma de alguns números. Quais são esses números? Bem, você recebe uma entrada ( a, b), que são números inteiros (positivos, negativos ou zero) a != b, e a < b, e cada número inteiro dentro ae b(incluindo eles) terá expoentes de acordo com os números de Fibonacci. Isso é confuso, então aqui está um exemplo:

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

Dado que o primeiro número de Fibonacci é representado por f(0), a fórmula é:

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

Entrada, Processamento, Saída

Para esclarecer o exposto, aqui estão alguns casos de teste, o processamento da entrada e as saídas esperadas:

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

Regras

  • Não são permitidas brechas padrão

  • Os expoentes devem estar em ordem de acordo com a série Fibonacci

  • O código deve funcionar para os casos de teste acima

  • Somente a saída precisa ser retornada

Critérios Vencedores

O menor código vence!

Anthony Pham
fonte
Então, 0não está incluído nos números de fibonacci aqui?
FlipTack
0 não é um número de Fibonacci, mas é uma opção válida para entrada #
Anthony Pham
6
33165 ou 33156?
31516 Neil
@ Neil Acho que você está certo #
Anthony Pham
Isso acima "a f (0) + ... + b f (b-a + 1)" está errado, por exemplo, para a = 1 eb = 2, seria 1 f (0) +2 f (2 ) Eu acho que seria a f (0) + ... + b f (ba); Aqui f (0) = 0 não 1
RosLuP 17/04

Respostas:

2

05AB1E , 9 bytes

ŸDg!ÅFsmO

Experimente online!

Ÿ         # 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.

Não funciona no TIO para grandes discrepâncias entre ae b(EG [a..b].length() > 25).

Mas parece funcionar para números maiores do que a resposta média aqui.

Ineficiente, porque calcula a sequência de fibonacci até n!, o que é mais do que o necessário para calcular a resposta, onde nestá o comprimento da sequência de a..b.

Urna de polvo mágico
fonte
5

Mathematica, 38 bytes 37 bytes 31 bytes

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

Esta é apenas a resposta de rahnema1 portada para o Mathematica. Abaixo está minha solução original:

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

Explicação:

##representa a sequência de todos os argumentos, #representa o primeiro argumento, #2representa o segundo argumento. Quando chamado com dois argumentos ae b, Range[##]dará a lista {a, a+1, ..., b}e Range[#2-#+1]a lista do mesmo tamanho {1, 2, ..., b-a+1}. Como Fibonaccié Listable, Fibonacci@Range[#2-#+1]dará uma lista dos primeiros b-a+1números de Fibonacci. Como Poweré Listable, chamá-lo em duas listas de igual comprimento o encadeará sobre as listas. Então Trpega a soma.

Editar: salvou 1 byte graças a Martin Ender.

ngenisis
fonte
3
Você pode usar Range@##.
Martin Ender
1
Não é tão relevante agora, mas a abordagem original pode ser aprimorada em 3 bytes para Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin
Usar Rangeduas vezes deveria ter sido uma bandeira vermelha. Obrigado!
Ngenisis 5/01
5

Python , 49 bytes

Um lambda recursivo que recebe ae bcomo argumentos separados (você também pode definir os dois primeiros números de fibonacci xe y, como desejar - não intencional, mas um recurso interessante):

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

Experimente online! (inclui suíte de testes)

Sugestões de golfe são bem-vindas.

FlipTack
fonte
Por que -~ae não simplesmente a+1? Eu acho -~aque depende da máquina.
Titus
4

Perl 6 , 32 30 bytes

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

$^ae $^bsão os dois argumentos para a função; $^a..$^bé o intervalo de números de $^aaté $^b, que é compactado com exponenciação pela Z**sequência de Fibonacci 1, &[+] ... *,.

Obrigado a Brad Gilbert por remover dois bytes.

Sean
fonte
(1,&[+]...*)é um byte mais curto e o espaço a seguir Z**não é necessário.
Brad Gilbert b2gills 01/01
@ BradGilbertb2gills Legal, eu não tinha idéia de que a sequência de Fibonacci pudesse ser expressa dessa maneira.
Sean
Na verdade, funciona porque &infix:<+>pode aceitar 0,1 ou 2 argumentos. ( &[+]é uma maneira curta de escrever &infix:<+>). O WhateverCode * + *aceita exatamente 2 argumentos. ( &[0]() == 0Assim você tem que ter o 1lá para começar a seqüência)
Brad Gilbert b2gills
3

Máximos, 32 bytes

f(a,b):=sum(x^fib(x-a+1),x,a,b);
rahnema1
fonte
3

Pyke, 11 bytes

h1:Foh.b^)s

Experimente aqui!

h1:         -   range(low, high+1)
   F     )  -  for i in ^:
    oh      -     (o++)+1
      .b    -    nth_fib(^)
        ^   -   i ** ^
          s - sum(^)
Azul
fonte
3

JavaScript (ES7), 42 bytes

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

Porta direta da excelente resposta Python do @ FlipTack.

Neil
fonte
Bom, ficou ainda mais curto em JavaScript! :)
FlipTack
3

Haskell, 35 bytes

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

Uso:

$ ghc fibexps.hs -e '[4..8]?f'
33156
Roman Czyborra
fonte
Você pode transformar a função oem um operador infix, como a#b=sum....
N
Teve infix considerado como um ... b, mas ler a exigência para aceitar unário (ℤ, ℤ) → ℕ
Roman Czyborra
Muitas outras respostas levam dois argumentos separados, então acho que está bem.
Ni
Tudo bem, já, isso nos leva a par com o lambda ECMAscript7. Mas se estamos autorizados a alimentação (a,b)como a?b, em seguida, por que não estamos autorizados a prepará-lo tão imediato [a..b]?fpara (?)=sum.zipWith(^)?
Roman Czyborra
Eu acho que isso vai longe demais. A entrada são dois números (não necessariamente como um par, dois argumentos separados servirão), mas você está alimentando uma lista de números e uma função para sua função principal.
nimi
2

MATL , 23 bytes

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

Experimente online! Ou verifique todos os casos de teste .

&:      % 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
Luis Mendo
fonte
1

R, 51 bytes

Uma função anônima.

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

Gelatina , 13 bytes

ạµ1+⁸С0
r*çS

Experimente online!

Lynn
fonte
Bom, a única outra resposta que encontrei onde uma entrada de f(1,25)trabalhos;). +1
Magic Octopus Urn
0

Ruby, 46 bytes

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

Nada particularmente inteligente ou original para ver aqui. Desculpe.

GB
fonte
Para mim, não falante de Ruby, o ℤ.upto(ℤ)método é um bom lembrete da beleza do comportamento de todos os objetos de Ruby. Golfe adicional o código é deixado como um exercício para falantes nativos de Ruby. Você já digitalizou codegolf.stackexchange.com/questions/363/… ainda?
Roman Czyborra
0

Java 7, 96 bytes

Golfe:

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;}

Ungolfed:

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;
}
peech
fonte
0

R, 57 bytes

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

Bem direto. gmp::fibnumé um built-in mais curto, mas não suporta o retorno de toda a sequência até n, o que numbers::fibonacciocorre adicionando o argumento T.

Primeiro, tive uma solução mais complicada com a gmp::fibnumqual terminou 2 bytes a mais que esta solução.

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F
JAD
fonte
Usar uma função anônima em vez de scan()salvar 6 bytes; veja minha solução postada.
precisa saber é
ah sim, bobo da minha parte.
JAD
0

dc , 56 bytes

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

Finaliza a entrada [1,30]em 51 segundos. Toma as duas entradas em duas linhas separadas uma vez executadas e números negativos com um sublinhado à esquerda ( _) em vez de um traço (ou seja, -4seria inserido como _4).

R. Kap
fonte
0

PHP, 77 75 bytes

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

toma limites dos argumentos da linha de comando. Corra com -nr.
mostrando as variáveis ​​variáveis ​​do PHP novamente (e o que eu descobri sobre elas .

demolir

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

A resposta do FlipTack portada para PHP tem 70 bytes:

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

Axioma, 65 bytes

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

código de teste e resultados

(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)
RosLuP
fonte
0

PowerShell , 67 bytes

$e=1;$args[0]..$args[1]|%{$s+=("$_*"*$e+1|iex);$e,$f=($e+$f),$e};$s

Experimente online!

Encontrei uma maneira um pouco melhor de fazer a sequência, mas o PowerShell não se compara a outros idiomas para este :)

Sinusoid
fonte