Antecedentes
Casi todos están familiarizados con los números de Fibonacci F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Estos están formados por la función de recursión F(n) = F(n-1) + F(n-2)
con F(0)=0
y F(1)=1
. A000045
Una secuencia estrechamente relacionada son los números de Lucas L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Estos están formados por la función de recursión L(m) = L(m-1) + L(m-2)
con L(0)=2
y L(1)=1
. A000032
Podemos alternar entre las dos secuencias en función de índices pares / impares, con la construcción
A(x) = F(x)
si x mod 2 = 0
y de lo A(x) = L(x)
contrario. Por ejemplo, A(4)
es igual a F(4)
desde 4 mod 2 = 0
. Vamos a llamar a esta secuencia de los números Lucas-NACCI , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Esto puede estar formado por la función de recursión A(x) = 3*A(x-2) - A(x-4)
con A(0)=0
, A(1)=1
, A(2)=1
, y A(3)=4
. A005013
Desafío
Dada entrada n
, salida de la secuencia de n+1
números hasta e incluyendo A(n)
como se describe anteriormente. Pocos bytes (o equivalentes de bytes, como para LabVIEW , como se determina individualmente en Meta) gana.
Entrada
Un solo entero no negativo n
.
Salida
Una lista de números que corresponden a la subsecuencia de números de Lucas-nacci de A(0)
a A(n)
. La lista debe estar en orden secuencial como se describió anteriormente.
Reglas
- Se aplican las reglas estándar de código de golf y las restricciones de escapatoria .
- Se aplican las reglas estándar de entrada / salida .
- El número de entrada puede estar en cualquier formato adecuado: unario o decimal, leído desde STDIN, función o argumento de línea de comando, etc. - usted elige.
- La salida puede imprimirse en STDOUT o devolverse como resultado de la llamada a la función. Si se imprimen, se deben incluir delimitadores adecuados para diferenciar los números (separados por espacios, separados por comas, etc.).
- Además, si la salida a STDOUT, los espacios en blanco circundantes, la nueva línea final, etc., son opcionales.
- Si la entrada es un número entero no negativo o entero, el programa puede hacer cualquier cosa o nada, ya que el comportamiento no está definido.
Ejemplos
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Respuestas:
Jalea, 12 bytes
Pruébalo en línea!
Antecedentes
Podemos extender F y L a -1 definiendo F (-1) = 1 y L (-1) = -1. Esto es consistente con la función recursiva.
Nuestro programa comienza con
En cada paso, para formar el siguiente par, invertimos el último par y lo agregamos al penúltimo par. Por ejemplo:
Si continuamos este proceso por unos pocos pasos más, obtenemos
La secuencia de Lucas-Nacci es simplemente la columna izquierda.
Cómo funciona
‡
С
mira los dos enlaces a la izquierda:2
yU+¥
. Como el más a la izquierda es un nilad, no puede ser el cuerpo del bucle. Por lo tanto,U+¥
se usa como cuerpo y se lee un número desde la entrada. Como no hay argumentos de línea de comandos, ese número se lee desde STDIN.fuente
CJam,
2120 bytesGracias a Sp3000 por guardar 1 byte.
Pruébalo aquí.
Explicación
Simplemente usa la recurrencia dada en la especificación de desafío.
fuente
Perl 6, 42 bytes
uso
fuente
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 bytesDefinición de serie adaptada de esta respuesta .
Menos golfizado:
fibLike start
da una lista infinita, que se define:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
devuelve 2 para entrada impar (serie Lucas) o 0 para par (serie Fibonacci).lucasNacci i
da el número i-ésimo de Lucas-nacci.firstN n
mapas sobre la lista.Un byte salvado por Boomerang.
fuente
2*mod i 2
yl
luego puedes quitar el paréntesis. Así:l a=2*mod a 2:scanl(+)1(l a)
yf n=[l i!!i|i<-[0..n]]
ES6, 65 bytes
Utiliza la relación de recurrencia dada en la pregunta.
fuente
Retina ,
706259 bytesPruébalo en línea
1?
$`¶
- Cree una línea para cada número de 0 a n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Agregarff
a líneas impares. Esto sembrará la función con L (0) = 2.m`$
f
- Añadirf
a todas las líneas (tenga en cuenta el espacio). Esto siembra la función con 0 y 1 para los números de Fibonacci, y 2 y 1 para los números de Lucas.+`1(f*) (f*)
$2 $2$1
- Bucle: calcular F (n + 1) = F (n) + F (n-1) mientras todavía hay 1s.f*
- Retire F (n + 1) del final de cada línea.
f
s de nuevo a 1s. Si esto no es necesario y podemos quedarnos conf
s, la longitud es de solo 55 bytes.fuente
Oracle SQL 11.2,
218216201 bytesSin golf
Logré ganar algunos bytes usando (¿abusando?) La función SIGN para generar los primeros 3 elementos de la secuencia.
fuente
Japt,
252221 bytes¡Pruébalo en línea!
Antecedentes
Es algo difícil crear una secuencia de Fibonacci en Japt, pero tenemos una función integrada
Mg
para hacerlo por nosotros. Sin embargo, esto solo nos da la secuencia de Fibonacci, no la secuencia de Lucas. Podemos lograr la secuencia de Lucas con bastante facilidad usando este truco:Como puede ver,
F(N-1) + F(N+1)
es igualL(N)
para todosN
. Sin embargo, dado que solo necesitamos números de Lucas en los índices impares, podemos combinar las dos fórmulas en una:Cómo funciona
fuente
Mathematica,
5251 bytesUna idea muy similar a la de Martin anterior, pasé algún tiempo tratando de encontrar una forma más corta de definir los "casos base" para la función. La interpolación polinómica fue un fracaso, así que decidí utilizar esta extensión en negativos para obtener una definición bastante corta.
fuente
Mathematica, 56 bytes
Implementación muy sencilla. Define una función auxiliar
f
y luego se evalúa como una función sin nombre que se aplicaf
a un rango para obtener todos los resultados. Esto se siente innecesariamente engorroso.Sin embargo, una sola función sin nombre parece ser un byte más:
fuente
MATL , 17
18bytesTraducción casi directa de la respuesta de Martin CJam .
Pruébalo en línea!
fuente
Brachylog , 51 bytes
Esto toma un número como entrada e imprime en STDOUT la lista, con espacios que separan cada número.
Explicación
El corte
!
en la primera regla del sub-predicado 1 es necesario para que cuando retrocedamos (\
), no terminemos en un bucle infinito donde el intérprete probará la segunda regla para una entrada menor que 4.fuente
Mathematica, 41 bytes
fuente
Groovy, 50 bytes
Esto define la función x, que toma n como su primer argumento y tiene el caso base de los primeros cuatro números en la secuencia de Fibocas como argumentos predeterminados para el resto de la función.
un aquí es n. b, c, dye son los siguientes cuatro elementos en la secuencia.
Disminuye n y se repite hasta que n es menor que cero; cuando se repite, agrega al valor de retorno final el primer elemento en su secuencia actual. Los nuevos valores para los siguientes cuatro elementos en la secuencia se dan a la llamada recursiva: los últimos tres elementos se desplazan para ser los primeros tres, y se genera un nuevo cuarto elemento a partir de dos de los elementos anteriores usando 3 * db.
Delimita nuevos valores con anidaciones de listas, ya que Groovy puede devolver múltiples valores al insertarlos en una lista, por lo que cada llamada devuelve el primer elemento actual y el resultado de la recursión, que será su propia lista.
fuente
R , 55 bytes
Pruébalo en línea!
fuente
Pilones , 19
Esta es una traducción bastante directa del enfoque de Martin.
Cómo funciona:
fuente
DUP , 32 bytes
Try it here!
Una lambda anónima que deja una secuencia de números en la pila. Uso:
Explicación
fuente
Python 2, 71 bytes
Esto definitivamente parece demasiado largo. Sin embargo, me complació poder usar el
not
operador bit a bit ... dos veces. Una vez como una especie de paridad, voltee hacia adelante y hacia atrás, y una vez para terminar la recursión cuandon
llegue-1
.La variable
p
siempre será0
o-1
, por lo que alternará entre entradas0
o-1
de la lista. (Elegir la entrada-1
de una lista de Python significa elegir el último elemento).fuente
Metaprogramación de plantilla C ++, 130 bytes
Las definiciones recursivas de alguna manera claman por C ++ TMP, uso:
con
x
ser lo queA(x)
te gusta.fuente