Você pode decompor um número maior que 0 como uma soma exclusiva dos números positivos de Fibonacci. Nesta questão, fazemos isso subtraindo repetidamente o maior número possível de Fibonacci positivo. Por exemplo:
1 = 1
2 = 2
3 = 3
4 = 3 + 1
12 = 8 + 3 + 1
13 = 13
100 = 89 + 8 + 3
Agora, chamo um produto de Fibonacci da mesma lista que acima, mas com a adição substituída pela multiplicação. Por exemplo f(100) = 89 * 8 * 3 = 2136
,.
Escreva um programa ou função que, dado um número inteiro positivo n, retorne o produto Fibonacci desse número.
Casos de teste:
1: 1
2: 2
3: 3
4: 3
5: 5
6: 5
7: 10
8: 8
9: 8
42: 272
1000: 12831
12345: 138481852236
code-golf
math
sequence
fibonacci
code-golf
word
code-golf
cipher
code-golf
string
math
subsequence
code-golf
regular-expression
code-golf
brainfuck
assembly
machine-code
x86-family
code-golf
math
factorial
code-golf
math
geometry
code-golf
math
arithmetic
array-manipulation
math
number
optimization
stack
metagolf
code-golf
tips
assembly
code-golf
tips
lisp
code-golf
number-theory
path-finding
code-golf
number
sequence
generation
code-golf
math
geometry
code-golf
grid
permutations
code-golf
code-golf
graphical-output
geometry
fractal
knot-theory
code-golf
math
arithmetic
code-golf
interpreter
balanced-string
stack
brain-flak
code-golf
math
set-theory
code-golf
math
array-manipulation
code-golf
code-golf
string
natural-language
code-golf
code-golf
math
linear-algebra
matrix
code-golf
string
encode
orlp
fonte
fonte
2
pode ser decomposto como-1 + 3
. A afirmação correta do teorema de Zeckendorf é que um número de Fibonacci positivo pode ser decomposto exclusivamente como uma soma de números de Fibonacci não consecutivos com índice positivo.Respostas:
Geléia ,
1615 bytesNão é particularmente rápido ou amigo da memória, mas eficiente o suficiente para todos os casos de teste. Experimente online!
Como funciona
fonte
Python, 54 bytes
Apenas uma boa e velha recursão.
fonte
Perl,
6963 + 4 (-pl61
sinalizador) = 67 bytesUsando:
Ungolfed:
Ideone .
fonte
061
é a codificação ASCII para o caractere'1'
. Bom truque para usar$\
para imprimi-lo quase de graça.JavaScript (ES6),
7842 bytesPorta da resposta do @ Sp3000. Versão original de 78 bytes:
fonte
> <> , 57 bytes
Espera que o número de entrada esteja presente na pilha no início do programa.
Constrói a sequência de Fibonacci (
f0, f1, f2, ..., fn
) na pilha até que seja atingido um número maior que a entrada (i
). Em seguida, com um produto (p
) inicializado para1
...Experimente online!
fonte
Pitão, 28 bytes
Eu acho que pode ser jogado muito mais longe ...
Experimente online!
fonte
Pitão, 24 bytes
Experimente on-line: Demonstration or Test Suite
Explicação:
Q
é atribuído com o número de entrada.A parte
h.WgQeH,eZsZ1
calcula o maior número de Fibonacci, menor ou igual aQ
Então
Q = 10
, se ele gera os números / pares:O restante do código calcula a partição e multiplica os números juntos:
Obviamente, existem muitas soluções mais curtas (com tempos de execução realmente ruins), como
*FhfqQsTyeM.u,eNsNQ1
.fonte
Haskell, 44 bytes
Yay para recursão mútua:
a
é o número anterior de Fibonaccib
é o número atual de Fibonaccic
é a entradaf
é a função desejadaMenos golfe:
fonte
Na verdade, 22 bytes
Experimente online!
Explicação:
fonte
Javascript (ES6)
13410692 bytesObrigado pelo @cat por detectar um espaço.
Apenas uma versão não otimizada feita no meu telefone, eu jogo quando chego em casa. Idéias são bem vindas.
fonte
RETURN , 44 bytes
Try it here.
Lambda anônima surpreendentemente ineficiente que deixa o resultado no Stack2. Uso:
NOTA: ␌ e ␁ são espaços reservados para seus respectivos caracteres não imprimíveis: alimentação de formulário e início do cabeçalho .
Explicação
fonte
PHP, 119 bytes
O código (dividido em duas linhas para facilitar a leitura):
A primeira linha calcula nos
$f
números de Fibonacci menores que$n
(o argumento fornecido na linha de comando). A segunda linha calcula os fatores de Fibonacci (por subtração) e os multiplica para calcular o produto$o
.Anexe o código com
<?php
(tecnicamente não faz parte do programa), coloque-o em um arquivo (fibonacci-factors.php
) e execute-o como:Ou execute-o usando
php -d error_reporting=0 -r '... code here ...' 100
.O código não-protegido e o conjunto de testes podem ser encontrados no Github .
fonte
Q, 47 bytes
Teste
leia-o como pares (i, mapa (m, i)), onde m é a função de cálculo ei os diferentes argumentos
escreve
Explicação
n funtion\arg
aplica function (function (function (... function (args))) n times (usa internamente tal recursão) e retorna a sequência de resultados. Calculamos os 60 primeiros itens da série fibonnaci como*+60(|+\)\1 0
. Nesse caso, a função é ( | +): + \ aplicado sobre uma sequência calcula somas parciais (ex + \ 1 2 3 é 1 3 6) e | inverte a seq. Portanto, cada 'iteração' calculamos somas parciais dos dois números anteriores de fibonacci e retornamos o parcial soma invertida60(|+\)\1 0
gera as seqüências 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...*+
aplicado sobre esse resultado flip (traspose) e pega o primeiro. 1 2 3 5 8 13 21 34 55 ..(cond)function\args
aplica function (function (.. function (args))) enquanto cond true e retorna a sequência de resultados parciaisfunction[arg]
aplicado sobre uma função de mais de um argumento cria uma projeção (aplicação parcial)Podemos dar um nome aos argumentos, mas os nomes implícitos são x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
declara um lambda com args x, y com projeção parcial (arg x é uma série de fibonacci, calcula como * + 60 (| +) \ 1 0). x representam valores de fibonacci e y o número a processar. A pesquisa binária (bin) é usada para localizar o índice do maior número de fibonacci <= y (x bin y
) e subtrair o valor correspondente de x.Para calcular o produto a partir de resultados parciais, nós os revertemos e calculamos a diferença de cada par (
-':|
), descartamos o primeiro (1_
porque é 0) e multiplicamos por (*/
).Se estamos interessados na soma acumulada, o código é o mesmo, mas com em
+/
vez de*/
. Também podemos usar qualquer outro operador diádico em vez de + ou *Sobre eficiência de execução
Eu sei que neste concurso a eficiência não é um problema. Mas neste problema, podemos variar de custo linear a custo exponencial, por isso estou curioso.
Eu desenvolvi uma segunda versão (comprimento de 48 bytes, excluindo comentários) e repeti os casos de teste de bateria 1000 vezes nas duas versões.
o tempo de execução é: versão original 0'212 seg, nova versão 0'037 seg
A versão original calcula a série fibbonaci uma vez por aplicativo de função; nova versão calcula fibonacci apenas um.
Em ambos os casos, o cálculo da série de fibonacci usa recursão da cauda
fonte