Exponentes de Fibonacci


11

Para este desafío, debe generar el resultado de la suma de algunos números. ¿Qué son estos números? Bueno, se le da entrada, ( a, b), que son enteros (positivo, negativo o cero) a != b, y a < b, y cada entero dentro ay b(incluyéndolos) tendrá exponentes de acuerdo con los números de Fibonacci. Eso es confuso, así que aquí hay un ejemplo:

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

Dado que el primer número de Fibonacci está representado por f(0), la fórmula es:

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

Entrada, procesamiento, salida

Para aclarar lo anterior, aquí hay algunos casos de prueba, el procesamiento de la entrada y las salidas 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

Reglas

  • No se permiten lagunas estándar

  • Los exponentes deben estar en orden de acuerdo con la serie de Fibonacci

  • El código debe funcionar para los casos de prueba anteriores

  • Solo la salida necesita ser devuelta

Criterios ganadores

¡El código más corto gana!


Entonces, 0¿no está incluido en los números de Fibonacci aquí?
FlipTack

0 no es un número de Fibonacci pero es una opción válida para la entrada
Anthony Pham

66
33165 o 33156?
Neil

@Neil Creo que tienes razón
Anthony Pham

Esto arriba de "a f (0) + ... + b f (b-a + 1)" está mal, por ejemplo para a = 1 y b = 2 sería 1 f (0) +2 f (2 ) Creo que sería a f (0) + ... + b f (ba); aquí f (0) = 0 no 1
RosLuP

Respuestas:


2

05AB1E , 9 bytes

ŸDg!ÅFsmO

Pruébalo en línea!

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

No funciona en TIO para grandes discrepancias entre ay b(EG [a..b].length() > 25).

Pero parece funcionar para números más grandes que la respuesta promedio aquí.

Ineficiente, porque calcula la secuencia de Fibonacci hasta n!, que es más de lo necesario para calcular la respuesta, donde nestá la longitud de la secuencia de a..b.


5

Mathematica, 38 bytes 37 bytes 31 bytes

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

Esta es solo la respuesta de rahnema1 portada a Mathematica. A continuación se muestra mi solución original:

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

Explicación:

##representa la secuencia de todos los argumentos, #representa el primer argumento, #2representa el segundo argumento. Cuando se llama con dos argumentos ay b, Range[##]dará la lista {a, a+1, ..., b}y Range[#2-#+1]dará la lista de la misma longitud {1, 2, ..., b-a+1}. Como Fibonaccies Listable, Fibonacci@Range[#2-#+1]dará una lista de los primeros b-a+1números de Fibonacci. Como Poweres Listable, llamarlo en dos listas de igual longitud lo enhebrará sobre las listas. Luego Trtoma la suma.

Editar: Guardado 1 byte gracias a Martin Ender.


3
Puedes usar Range@##.
Martin Ender

1
Ahora no es tan relevante, pero el enfoque original se puede mejorar en 3 bytes Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin el

Usar Rangedos veces debería haber sido una bandera roja. ¡Gracias!
ngenisis

5

Python , 49 bytes

Una lambda recursiva que toma ay bcomo argumentos separados (también puede establecer los dos primeros números de fibonacci xy y, a lo que quiera, no intencional, sino una buena característica):

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

Pruébalo en línea! (incluye suite de pruebas)

Sugerencias de golf bienvenidas.


¿Por qué -~ay no simplemente a+1? Creo que -~adepende de la máquina.
Titus

4

Perl 6 , 32 30 bytes

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

$^ay $^bson los dos argumentos de la función; $^a..$^bes el rango de números de $^aa $^b, que es comprimido con exponenciación por Z**con la secuencia de Fibonacci, 1, &[+] ... *.

Gracias a Brad Gilbert por reducir dos bytes.


(1,&[+]...*)es un byte más corto y Z**no se necesita espacio después .
Brad Gilbert b2gills

@ BradGilbertb2gills Genial, no tenía idea de que la secuencia de Fibonacci podría expresarse de esa manera.
Sean

En realidad funciona porque &infix:<+>puede aceptar 0,1 o 2 argumentos. ( &[+]es una forma corta de escribir &infix:<+>). El WhateverCode * + *acepta exactamente 2 argumentos. ( &[0]() == 0por lo que debe tener 1allí para comenzar la secuencia)
Brad Gilbert b2gills


3

Pyke, 11 bytes

h1:Foh.b^)s

Pruébalo aquí!

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

3

JavaScript (ES7), 42 bytes

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

Puerto directo de la excelente respuesta de Python de @ FlipTack.


¡Agradable, resultó aún más corto en JavaScript! :)
FlipTack

3

Haskell, 35 bytes

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

Uso:

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

Puede convertir la función oen un operador infijo, como a#b=sum....
nimi

Había considerado el infijo como a ... b, pero leí el requisito de aceptar unario (ℤ, ℤ) → ℕ
Roman Czyborra

Muchas otras respuestas toman dos argumentos separados, así que creo que está bien.
nimi

Ya está bien, eso nos lleva a la par con el lambda ECMAscript7. Pero si se nos permite la alimentación (a,b)como a?b¿por qué no se nos permite prepararlo tan inmediata [a..b]?fa (?)=sum.zipWith(^)?
Roman Czyborra

Creo que esto va demasiado lejos. La entrada son dos números (no necesariamente como un par, dos argumentos por separado lo harán), pero está alimentando una lista de números y una función a su función principal.
nimi

2

MATL , 23 bytes

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

Pruébalo en línea! O verificar todos los casos de prueba .

&:      % 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 bytes

Una función anónima.

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


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 u original para ver aquí. Lo siento.


Para mí, que no hablo de Ruby, el ℤ.upto(ℤ)método es un buen recordatorio de la belleza del comportamiento de Ruby en todos los objetos. Seguir jugando golf el código se deja como ejercicio para los hablantes nativos de Ruby. ¿ Ya escaneó codegolf.stackexchange.com/questions/363/… ?
Roman Czyborra

0

Java 7, 96 bytes

Golfizado:

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

Sin golf:

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 bytes

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

Muy claro. gmp::fibnumes una versión incorporada más corta, pero no admite devolver toda la secuencia n, lo que numbers::fibonaccihace agregando el argumento T.

Primero tuve una solución más complicada con la gmp::fibnumque terminé 2 bytes más que esta solución.

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

Usar una función anónima en lugar de scan()guardar 6 bytes; Vea mi solución publicada.
rturnbull

Ah sí, tonto de mi parte.
JAD

0

cc , 56 bytes

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

Termina para la entrada [1,30]en 51 segundos. Toma las dos entradas en dos líneas separadas una vez ejecutadas y los números negativos con un guión bajo ( _) en lugar de un guión (es decir -4, se ingresarán como _4).


0

PHP, 77 75 bytes

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

toma límites de los argumentos de la línea de comando. Corre con -nr.
mostrando nuevamente las variables variables de PHP (y lo que he descubierto sobre ellas) .

Descompostura

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

La respuesta de FlipTack portada a PHP tiene 70 bytes:

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

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 prueba y 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)

0

PowerShell , 67 bytes

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

Pruébalo en línea!

Encontré una forma ligeramente mejor de hacer la secuencia, pero powershell no se compara con otros idiomas para este :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.