fundo
Quase todo mundo está familiarizado com os números de Fibonacci F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Estes são formados pela função de recursão F(n) = F(n-1) + F(n-2)
com F(0)=0
e F(1)=1
. A000045
Uma sequência intimamente relacionada são os números de Lucas L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Estes são formados pela função de recursão L(m) = L(m-1) + L(m-2)
com L(0)=2
e L(1)=1
. A000032
Podemos alternar entre as duas seqüências com base em índices pares / ímpares, com a construção
A(x) = F(x)
se x mod 2 = 0
e de A(x) = L(x)
outra forma. Por exemplo, A(4)
é igual a F(4)
since 4 mod 2 = 0
. Vamos chamar essa seqüência os números Lucas-Nacci , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Este pode ser formado pela função recursão A(x) = 3*A(x-2) - A(x-4)
com A(0)=0
, A(1)=1
, A(2)=1
, e A(3)=4
. A005013
Desafio
Com base na entrada n
, imprima a sequência de n+1
números até e incluindo, A(n)
conforme descrito acima. Menos bytes (ou equivalentes de bytes, como no LabVIEW , conforme determinado individualmente no Meta) ganham.
Entrada
Um único inteiro não negativo n
.
Resultado
Uma lista de números que correspondem à subsequência dos números de Lucas-nacci de A(0)
até A(n)
. A lista deve estar em ordem seqüencial, conforme descrito acima.
Regras
- Aplicam-se regras padrão de código de golfe e restrições de brechas .
- Aplicam- se regras de entrada / saída padrão .
- O número da entrada pode estar em qualquer formato adequado: unário ou decimal, lido em STDIN, função ou argumento de linha de comando, etc. - sua escolha.
- A saída pode ser impressa em STDOUT ou retornada como resultado da chamada de função. Se impressos, delimitadores adequados para diferenciar os números devem ser incluídos (separados por espaço, separados por vírgula, etc.).
- Além disso, se a saída para STDOUT, o espaço em branco circundante, a nova linha à direita, etc. forem opcionais.
- Se a entrada for um não inteiro ou um número inteiro negativo, o programa poderá fazer qualquer coisa ou nada, pois o comportamento é indefinido.
Exemplos
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
Respostas:
Gelatina, 12 bytes
Experimente online!
fundo
Podemos estender F e L para -1 definindo F (-1) = 1 e L (-1) = -1. Isso é consistente com a função recursiva.
Nosso programa começa com
Em cada etapa, para formar o próximo par, invertemos o último par e o adicionamos ao penúltimo par. Por exemplo:
Se continuarmos esse processo por mais algumas etapas, obteremos
A sequência Lucas-nacci é simplesmente a coluna da esquerda.
Como funciona
‡
С
espreita os dois links à esquerda:2
eU+¥
. Como o mais à esquerda é um nilad, ele não pode ser o corpo do loop. Portanto,U+¥
é usado como corpo e um número é lido da entrada. Como não há argumentos de linha de comando, esse número é lido a partir de STDIN.fonte
CJam,
2120 bytesAgradecimentos ao Sp3000 por economizar 1 byte.
Teste aqui.
Explicação
Simplesmente usa a recorrência dada na especificação do desafio.
fonte
Perl 6, 42 bytes
uso
fonte
{( (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 bytesDefinição de série adaptada a partir desta resposta .
Menos golfe:
fibLike start
dá uma lista infinita, definido:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
retorna 2 para entrada ímpar (série Lucas) ou 0 para par (série Fibonacci).lucasNacci i
dá o i-ésimo número de Lucas-nacci.firstN n
mapas sobre a lista.Um byte salvo pelo Boomerang.
fonte
2*mod i 2
- se paral
remover os parênteses. Assim:l a=2*mod a 2:scanl(+)1(l a)
ef n=[l i!!i|i<-[0..n]]
ES6, 65 bytes
Usa a relação de recorrência fornecida na pergunta.
fonte
Retina ,
706259 bytesExperimente online
1?
$`¶
- Crie uma linha para cada número de 0 a n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Acrescenteff
a linhas ímpares. Isso irá propagar a função com L (0) = 2.m`$
f
- Anexarf
a todas as linhas (observe o espaço). Isso semeia a função com 0 e 1 para números de Fibonacci e 2 e 1 para números de Lucas.+`1(f*) (f*)
$2 $2$1
- Loop: calcula F (n + 1) = F (n) + F (n-1) enquanto ainda existem 1s.f*
- Remova F (n + 1) do final de cada linha.
f
s de volta para 1s. Se isso não for necessário e pudermos ficar comf
s, o comprimento será de apenas 55 bytes.fonte
Oracle SQL 11.2,
218216201 bytesSem golfe
Consegui ganhar alguns bytes usando (abusando?) Da função SIGN para gerar os 3 primeiros elementos da sequência.
fonte
Japonês,
252221 bytesTeste online!
fundo
É um pouco difícil criar uma sequência de Fibonacci em Japt, mas temos um recurso interno
Mg
para fazer isso por nós. No entanto, isso nos dá apenas a sequência de Fibonacci, não a sequência de Lucas. Podemos realizar a sequência de Lucas com bastante facilidade usando este truque:Como você pode ver,
F(N-1) + F(N+1)
é igualL(N)
para todosN
. No entanto, como precisamos apenas dos números de Lucas nos índices ímpares, podemos combinar as duas fórmulas em uma:Como funciona
fonte
Mathematica,
5251 bytesIdéia muito semelhante à de Martin, passei algum tempo tentando encontrar uma maneira mais curta de definir os "casos básicos" para a função. A interpolação polinomial foi um fracasso, então eu fui para isso, usando a extensão em negativos para produzir uma definição bastante curta.
fonte
Mathematica, 56 bytes
Implementação muito direta. Define uma função auxiliar
f
e avalia como uma função sem nome que se aplicaf
a um intervalo para obter todos os resultados. Isso parece desnecessariamente pesado.Uma única função sem nome parece ter um byte a mais:
fonte
MATL , 17
18bytesTradução quase direta da resposta CJam de Martin .
Experimente online!
fonte
Braquilog , 51 bytes
Isso recebe um número como entrada e é impresso em STDOUT na lista, com espaços separando cada número.
Explicação
O corte
!
na primeira regra do sub-predicado 1 é necessário para que, quando retrocedamos (\
), não terminemos em um loop infinito, em que o intérprete tente a segunda regra para uma entrada menor que 4.fonte
Mathematica, 41 bytes
fonte
Groovy, 50 bytes
Isso define a função x, que recebe n como seu primeiro argumento e tem o caso base dos quatro primeiros números na sequência Fibocas como argumentos padrão para o restante da função.
a aqui é n. b, c, d e e são os próximos quatro elementos na sequência.
Ele decrementa n e se repete até que n seja menor que zero - quando se repete, adiciona ao valor de retorno final o primeiro elemento em sua sequência atual. Os novos valores para os próximos quatro elementos na sequência são dados à chamada recursiva - os últimos três elementos passam a ser os três primeiros e um novo quarto elemento é gerado a partir de dois dos elementos anteriores usando 3 * db.
Ele delimita novos valores com aninhamentos de lista, pois o groovy pode retornar vários valores colocando-os em uma lista - portanto, cada chamada retorna o primeiro elemento atual e o resultado da recursão, que será sua própria lista.
fonte
R , 55 bytes
Experimente online!
fonte
Postes , 19
Esta é uma tradução bastante direta da abordagem de Martin.
Como funciona:
fonte
DUP , 32 bytes
Try it here!
Uma lambda anônima que deixa uma sequência de números na pilha. Uso:
Explicação
fonte
Python 2, 71 bytes
Isso definitivamente parece muito longo. No entanto, fiquei satisfeito por poder usar o
not
operador bit a bit ... duas vezes. Uma vez como uma espécie de paridade, vire para frente e para trás e uma vez para encerrar a recursão quandon
atingir-1
.A variável
p
sempre será um0
ou-1
, portanto, alternará entre as entradas0
ou-1
a lista. (Escolher a entrada-1
de uma lista Python significa escolher o último elemento.)fonte
Meta Programação em C ++, 130 bytes
Definições recursivas de alguma forma pedem C ++ TMP, uso:
com
x
ser oA(x)
que quiser.fonte