A famosa sequência de Fibonacci é F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)
(para este desafio, começamos com 0).
Seu desafio: Dado n , saída a soma de toda a d th números de Fibonacci para todos os divisores de d do n º número de Fibonacci. Se você preferir uma notação mais formal,
Entrada : um número inteiro positivo n
Saída : a soma
Por exemplo, considere n=4
. F(4) = 3
Os divisores de 3 são 1 e 3, portanto a saída deve ser F(1) + F(3) = 1 + 2 = 3
.
Para n=6
, F(6) = 8
, e os divisores de 8 são 1, 2, 4, 8, de modo que a saída é F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26
.
Casos de teste:
1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26
Este é o código-golfe , a resposta mais curta em bytes ganha. Aplicam-se brechas padrão .
code-golf
number-theory
fibonacci
division
Neil A.
fonte
fonte
Geléia , 7 bytes
Experimente online!
Explicação:
fonte
Mathematica, 29 bytes
fonte
Mathematica Simplificado , 14 bytes
Bem, isso acabou sendo idêntico à solução da @ MartinEnder ...
fonte
N
)Japt , 11 bytes
Experimente online!
fonte
05AB1E , 11 bytes
Experimente online!
Explicação
fonte
Haskell, 54 bytes
Exemplo de uso:
g 6
->26
. Experimente online!fonte
Alice ,
3836 bytesAgradecemos a Leo por salvar 2 bytes.
Experimente online!
Quase certamente não é o ideal. O fluxo de controle é bastante elaborado e, embora eu esteja feliz com a quantidade de bytes que foram salvos nas versões anteriores, sinto que estou complicando demais as coisas, que podem ser mais simples e solução mais mais curta.
Explicação
Primeiro, preciso elaborar um pouco a pilha de endereços de retorno (RAS) de Alice. Como muitos outros fungeóides, Alice tem um comando para pular o código. No entanto, também possui comandos para retornar de onde você veio, o que permite implementar sub-rotinas de maneira bastante conveniente. Obviamente, sendo uma linguagem 2D, as sub-rotinas realmente existem apenas por convenção. Não há nada que impeça você de entrar ou sair de uma sub-rotina por outros meios além de um comando de retorno (ou em qualquer ponto da sub-rotina) e, dependendo de como você usa o RAS, talvez não exista uma hierarquia de salto / retorno limpa.
Em geral, isso é implementado com o comando jump
j
enviar o endereço IP atual ao RAS antes de saltar. O comando de retornok
aparece um endereço do RAS e salta para lá. Se o RAS estiver vazio,k
não fará nada.Há também outras maneiras de manipular o RAS. Dois deles são relevantes para este programa:
w
envia o endereço IP atual para o RAS sem ir para qualquer lugar. Se você repetir esse comando, poderá escrever loops simples de maneira bastante conveniente,&w...k
, já fiz em respostas anteriores.J
é como,j
mas não se lembra do endereço IP atual no RAS.Também é importante observar que o RAS não armazena informações sobre a direção do IP. Portanto, retornar a um endereço com
k
sempre preservará a direção atual do IP (e, portanto, também se estamos no modo Cardinal ou Ordinal), independentemente de como passamos peloj
ouw
que empurrou o endereço IP em primeiro lugar.Com isso, vamos começar examinando a sub-rotina no programa acima:
Essa sub-rotina puxa o elemento inferior da pilha, n , para o topo e depois calcula os números de Fibonacci F (n) e F (n + 1) (deixando-os no topo da pilha). Nunca precisamos de F (n + 1) , mas ele será descartado fora da sub-rotina, devido à forma como os
&w...k
loops interagem com o RAS (que tipo de requer que esses loops estejam no final de uma sub-rotina). A razão pela qual estamos pegando elementos da parte inferior em vez da parte superior é que isso nos permite tratar a pilha mais como uma fila, o que significa que podemos calcular todos os números de Fibonacci de uma só vez sem precisar armazená-los em outro lugar.Aqui está como essa sub-rotina funciona:
O final do ciclo é um pouco complicado. Enquanto houver uma cópia do endereço 'w' na pilha, isso inicia a próxima iteração. Uma vez esgotados, o resultado depende de como a sub-rotina foi invocada. Se a sub-rotina foi chamada com 'j', o último 'k' retorna lá, então o final do loop é duplicado como o retorno da sub-rotina. Se a sub-rotina foi chamada com 'J' e ainda há um endereço anterior na pilha, pulamos para lá. Isso significa que se a sub-rotina foi chamada no próprio loop externo, esse 'k' retorna ao início desse loop externo . Se a sub-rotina foi chamada com 'J', mas o RAS está vazio agora, esse 'k' não faz nada e o IP simplesmente continua se movendo após o loop. Usaremos todos os três casos no programa.
Finalmente, para o próprio programa.
Estas são apenas duas excursões rápidas ao modo Ordinal para ler e imprimir números inteiros decimais.
Após o
i
, existe umw
que lembra a posição atual antes de passar para a sub-rotina, devido à segunda/
. Essa primeira chamada da sub-rotina calculaF(n)
eF(n+1)
na entradan
. Depois, voltamos para cá, mas estamos indo para o leste agora, então o restante dos operadores do programa está no modo Cardinal. O programa principal fica assim:Aqui
31J
está outra chamada para a sub-rotina e, portanto, calcula um número de Fibonacci.fonte
Axioma, 68 bytes
algum teste
fonte
Pari / GP , 34 bytes
Experimente online!
fonte
Python 2 ,
8984 bytes-5 bytes graças a ovs
Experimente online!
fonte
R, 77 bytes
Faz uso da biblioteca 'gmp'. Isso possui uma função Fibonacci integrada e fornece a capacidade de realizar grandes números. Isso causou alguns problemas com seqs e applys, embora ainda seja menor do que criar minha própria função Fibonacci.
Explicação
Teste
Sem usar gmp
81 bytes , função recursiva que é irremediavelmente lenta quando números grandes (9+) são selecionados
88 bytes , a fórmula de Binet que funcionará razoavelmente bem com números maiores, mas ainda atinge o limite inteiro rapidamente
fonte
Perl 6 , 49 bytes
fonte
CJam , 26 bytes
Experimente online!
Tenho certeza que isso pode ser feito melhor. Explicação:
A idéia é ter uma matriz de números de Fibonacci e pontuá-la com uma matriz com 1s e 0s se esse número for ou não um divisor da entrada.
fonte
JavaScript (ES6),
7665 bytesCasos de teste
Mostrar snippet de código
fonte
JavaScript (ES6),
10510410310197 bytesTente
fonte
(z=g(i)/y)>~~z
para(z=g(i)/y)%1
, se você está apenas verificando sez
é um número inteiro.g(z)
para,g(z|0)
mas nos traz de volta a mesma contagem de bytes.Q, 75 bytes
fonte
C (gcc) ,
939080 bytesExperimente online!
fonte
Adicionar ++ , 89 bytes
Experimente online!
fonte