Secuencia de Fibonacci de Potencia Alterna

Dennis 08/19/2017. 12 answers, 2.084 views
code-golf math sequence array-manipulation fibonacci

Definición

La secuencia de Fibonacci de potencia alterna se forma de la siguiente manera.

  1. Comience con la secuencia vacía y establezca n en 1 .

  2. Calcule f n , el n ° número de Fibonacci no negativo, con repeticiones.
    0 es el primero, 1 es el segundo y el tercero, 2 es el cuarto. Todos los demás se obtienen sumando los dos números anteriores en la secuencia, por lo que 3 = 1 + 2 es el quinto, 5 = 2 + 3 es el sexto, etc.

  3. Si n es impar, cambie el signo de f n .

  4. Agregue 2n-1 copias de f n a la secuencia.

  5. Incrementa n vuelve al paso 2.

Estos son los primeros cien términos de la secuencia APF.

0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 

Tarea

Escriba un programa completo o una función que toma un entero positivo n como entrada e imprime o devuelve el enésimo término de la secuencia APF.

Si prefiere la indexación basada en 0, alternativamente puede tomar un entero n no negativo e imprimir o devolver el número de APF en el índice n .

Esto es ; ¡puede ganar el código más corto en bytes!

Casos de prueba (basados ​​en 1)

1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610 

Casos de prueba (basados ​​en 0)

0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610 
4 Comments
Okx 01/31/2017
¿Hay alguna restricción para n ?
2 Dennis♦ 01/31/2017
Siempre que su algoritmo funcione para valores arbitrariamente grandes de n , puede suponer que se ajusta a su tipo de datos.
1 Mindwin 02/01/2017
¿Esto tiene un número OEIS?
Dennis♦ 02/01/2017
@Mindwin no.

12 Answers


Jonathan Allan 01/31/2017.

Jelly , 5 bytes

BLCÆḞ 

Try it online!

¿Cómo?

Extender la serie de Fibonacci a índices negativos de modo que la relación f(i) = f(i-2) + f(i-1) aún se mantenga:

i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ... 

Volviendo de i=0 los números son los que necesitamos repetir 2n-1 veces, y el Fibonacci incorporado de Jelly, ÆḞ , los calculará.

Podemos encontrar el -i (un número positivo) que necesitamos tomando la longitud de bit de n y restando 1 .

Como queremos i (un número negativo) podemos realizar 1-bitLength y Jelly tiene un átomo para 1-x , C , la mónada del complemento.

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21 
3 comments
miles 01/31/2017
Sabía que había un camino más corto pero no tanto, pensé que sería de 7 bytes con una forma de eliminar µ y
Jonathan Allan 01/31/2017
Sin embargo, su repetida negación fue inteligente, estaba buscando poderes de menos uno, lo que agrega un par de bytes, hasta que recordé acerca de los valores negativos de Fibonacci y traté de conectarlos a la mónada de Jelly.
4 ETHproductions 01/31/2017
Honestamente, estoy sorprendido de que Jelly no tenga un byte incorporado para obtener la longitud binaria de un número ...

xnor 01/31/2017.

Python 2 , 30 bytes

 f=lambda n:n<1or f(n/4)-f(n/2) 

¡Pruébalo en línea!

One-indexed.

La secuencia se sintió como un rompecabezas, algo que Dennis generó al tener una forma corta de expresarlo. Las repeticiones de la potencia de dos sugieren recurrencia por desplazamiento de bit (división del piso por 2). La recursividad de Fibonacci de signo alterno f(n)=f(n-2)-f(n-1) se puede adaptar al desplazamiento de bits en lugar de disminuir. El caso base funciona bien porque todo se canaliza a n=0 .


martin 02/01/2017.

Mathematica, 43 36 24 bytes

Fibonacci@-Floor@Log2@#& 

7 bytes guardados gracias a @GregMartin, y 12 más gracias a @JungHwanMin.

2 comments
1 Greg Martin 01/31/2017
Puede guardar unos pocos bytes con Floor@Log2@# , y escribiendo Fibonacci[t=...] (y eliminando los espacios en el último exponente).
1 JungHwan Min 02/01/2017
-12 bytes: Fibonacci@-Floor@Log2@#& - Fibonacci puede tomar argumentos negativos (se ocupa del signo por usted).

Luis Mendo 02/01/2017.

MATL , 19 17 16 11 bytes

lOiB"yy-]x& 

La entrada está basada en 1.

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

Cómo funciona

Para la entrada n basada en n , sea m la cantidad de dígitos en la expansión binaria de n . El enésimo término en la secuencia de salida es el m -ésimo término en la secuencia de Fibonacci, posiblemente con su signo cambiado.

Una idea sería iterar m veces para calcular los términos de la secuencia de Fibonacci. Esto es fácil con a for each ciclo usando la matriz de dígitos binarios. Si la secuencia de Fibonacci se inicializó con 0 , entonces 1 como de costumbre, iterar m veces resultaría en m+2 términos en la pila, por lo que los dos primeros números tendrían que ser eliminados. En cambio, realizamos una inicialización con 1 , luego 0 . De esta forma, los siguientes términos generados son 1 , 1 , 2 , ... y solo se necesita one eliminación.

El signo podría tratarse utilizando otro ciclo para cambiar el signo m veces. Pero eso es costoso Es mejor integrar los dos bucles, lo cual se hace simplemente subtracting lugar de agregar en la iteración de Fibonacci.

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack 

ETHproductions 04/13/2017.

JavaScript (ES6), 33 bytes

f=(n,p=1,c=0)=>n?-f(n>>1,c,p+c):p 

1-indexado.

La respuesta de un puerto de xnor sería 23:

f=n=>n<1||f(n/4)-f(n/2) 

ovs 02/18/2017.

Python 2 , 83 82 79 bytes

 def f(n,a=0,b=1):
 l=bin(n)[2:]
 for _ in l:a,b=b,a+b
 return a*-(len(l)%2or-1) 

¡Pruébalo en línea!

1 comments
TuukkaX 01/31/2017
Espacio en blanco no requerido en or -1 .

miles 01/31/2017.

Jelly , 9 bytes

BLµ’ÆḞN⁸¡ 

Utiliza indexación basada en una sola.

¡Pruébalo en línea!

Explicación

Este método funciona si su función de Fibonacci solo admite argumentos no negativos.

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1) 

ETHproductions 01/31/2017.

Japt , 6 bytes

Mg1-¢l 

Pruébalo en línea!

Cómo funciona

Como se menciona en otras respuestas, el noveno término en la serie de Fibonacci de signo alterno es el mismo que el término -nº en la serie regular. n se puede encontrar tomando la longitud de bit de la entrada y restando una; negar esto da como resultado 1 menos la longitud del bit.

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index. 

Emigna 04/13/2017.

05AB1E , 11 10 bytes

Utiliza indexación basada en 1

La función Fibonacci de 05AB1E devuelve números 05AB1E positivos menores que n , lo que significa que tendríamos que generar más de lo necesario, obtener el correcto por índice y luego calcular el signo. Así que dudo que cualquier método basado en eso sea más corto que el cálculo iterativo de los números.

Utiliza la comprensión de que podemos inicializar la pila con 1, 0 invertida para manejar el caso cuando n=1 como se describe en la respuesta MATL de Luis Mendo .

XÎbgG‚D«`- 

¡Pruébalo en línea!

Explanation

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements 

smls 01/31/2017.

Perl 6 , 53 bytes

 {flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]} 

Implementación directa de la secuencia, la forma en que fue descrita.
Basado en cero


Dennis 04/13/2017.

Julia 0.5 , 19 bytes

 !n=n<1||!(n/=4)-!2n 

¡Pruébalo en línea!

Cómo funciona

Esto usa la misma fórmula que la respuesta de Python de @xnor . La relación de recurrencia
g(n) = g(n-2) + g(n-1) genera los términos negativos de la secuencia de Fibonacci, que igualan los términos positivos con signos alternos. Desde cualquier lugar en una carrera de 2 k repeticiones del mismo número, podemos elegir cualquier repetición de la ejecución previa de 2 k-1 números y la ejecución de 2 k-2 números antes de los dividiendo el índice por 2 y 4 .

En lugar de la simple

 f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes 

podemos redefinir un operador para nuestros propósitos. Además, f funcionará igual de bien con flotadores, entonces obtenemos

 !n=n<1||!(n/4)-!(n/2)   # 21 bytes 

Finalmente, si actualizamos n con una división por 4 , wwe puede escribir n/2 como 2n y omitir un par de parens, lo que lleva a la definición de la función de 19 bytes en esta respuesta.


miles 02/05/2017.

J , 18 bytes

(%>:-*:)t.@<:@#@#: 

Utiliza indexación basada en una sola. Toma un entero de entrada n > 0 y calcula el floor(log2(n)) al encontrar la longitud de su representación binaria y luego disminuye ese valor en uno. Luego encuentra el floor(log2(n))-1 coeficiente de la función generadora x / (1 + x - x 2 ) que es el gf para los valores de Fibonacci indexados negativamente.

¡Pruébalo en línea!

Explicación

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value 

HighResolutionMusic.com - Download Hi-Res Songs

1 (G)I-DLE

POP/STARS flac

(G)I-DLE. 2018. Writer: Riot Music Team;Harloe.
2 Ariana Grande

​Thank U, Next flac

Ariana Grande. 2018. Writer: Crazy Mike;Scootie;Victoria Monét;Tayla Parx;TBHits;Ariana Grande.
3 Imagine Dragons

Bad Liar flac

Imagine Dragons. 2018. Writer: Jorgen Odegard;Daniel Platzman;Ben McKee;Wayne Sermon;Aja Volkman;Dan Reynolds.
4 Clean Bandit

Baby flac

Clean Bandit. 2018. Writer: Jack Patterson;Kamille;Jason Evigan;Matthew Knott;Marina;Luis Fonsi.
5 Backstreet Boys

Chances flac

Backstreet Boys. 2018.
6 BTS

Waste It On Me flac

BTS. 2018. Writer: Steve Aoki;Jeff Halavacs;Ryan Ogren;Michael Gazzo;Nate Cyphert;Sean Foreman;RM.
7 Fitz And The Tantrums

HandClap flac

Fitz And The Tantrums. 2017. Writer: Fitz And The Tantrums;Eric Frederic;Sam Hollander.
8 BlackPink

Kiss And Make Up flac

BlackPink. 2018. Writer: Soke;Kny Factory;Billboard;Chelcee Grimes;Teddy Park;Marc Vincent;Dua Lipa.
9 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
10 Diplo

Close To Me flac

Diplo. 2018. Writer: Ellie Goulding;Savan Kotecha;Peter Svensson;Ilya;Swae Lee;Diplo.
11 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
12 Imagine Dragons

Machine flac

Imagine Dragons. 2018. Writer: Wayne Sermon;Daniel Platzman;Dan Reynolds;Ben McKee;Alex Da Kid.
13 Little Mix

The Cure flac

Little Mix. 2018. Writer: Pete Kelleher;Camille Purcell;Tom Barnes;Ben Kohn.
14 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
15 Calum Scott

No Matter What flac

Calum Scott. 2018. Writer: Toby Gad;Calum Scott.
16 Frida Sundemo

Apologize flac

Frida Sundemo. 2018.
17 Little Mix

Woman Like Me flac

Little Mix. 2018. Writer: Nicki Minaj;Steve Mac;Ed Sheeran;Jess Glynne.
18 Kelly Clarkson

Never Enough flac

Kelly Clarkson. 2018. Writer: Benj Pasek;Justin Paul.
19 Ashley Tisdale

Voices In My Head flac

Ashley Tisdale. 2018. Writer: John Feldmann;Ashley Tisdale.
20 Haley Reinhart

Something Strange flac

Haley Reinhart. 2018.

Related questions

Hot questions

Language

Popular Tags