Como você provavelmente sabe, um número de Fibonacci é aquele que é a soma dos dois números anteriores da série.
Um Fibonacci Digit ™ é aquele que é a soma dos dois dígitos anteriores .
Por exemplo, para o início da série 1,1
, a série seria 1,1,2,3,5,8,13,4,7,11,2...
A alteração ocorre após o 13
, onde, em vez de adicionar 8+13
, você adiciona 1+3
. A série faz um loop no final, onde 4+7=11
e 1+1=2
, o mesmo que a série começa.
Para outro exemplo, as séries começando 2,2
: 2,2,4,6,10,1,1,2,3,5,8,13,4,7,11,2,3...
. Este começa de forma exclusiva, mas quando os dígitos somam 10
, você termina com 1+0=1, 0+1=1
, e a série continua - e faz um loop - da mesma forma que a 1,1
série.
O desafio
Dada uma entrada inteira 0≤n≤99
, calcule o loop na série Fibonacci Digit começando com esses dois dígitos. (Você certamente pode considerar números inteiros fora desse intervalo, mas isso não é obrigatório.) Se for fornecida uma entrada de um dígito, seu código deve interpretá-la para indicar o início da série 0,n
.
Todos os números no loop com dois dígitos devem ser emitidos como dois dígitos. Assim, por exemplo, o loop para 1,1
conteria 13
, não 1,3
.
A saída começa com o primeiro número no loop. Portanto, com base nas restrições acima, o loop para 1,1
começa com 2
, desde 1,1
e 11
é contado separadamente.
Cada número da saída pode ser separado pelo que você quiser, desde que seja consistente. Em todos os meus exemplos, uso vírgulas, mas espaços, quebras de linha, letras aleatórias etc. são permitidos, desde que você sempre use a mesma separação. Assim 2g3g5g8g13g4g7g11
é uma saída legal para 1
, mas 2j3g5i8s13m4g7sk11
não é. Você pode usar cadeias, listas, matrizes, o que for, desde que você tenha os números corretos na ordem correta separados por um separador consistente. O bracketing de toda a saída também é permitido (ex. (5,9,14)
Ou [5,9,14]
etc.).
Casos de teste:
1 -> 2,3,5,8,13,4,7,11
2 -> 2,3,5,8,13,4,7,11
3 -> 11,2,3,5,8,13,4,7
4 -> 3,5,8,13,4,7,11,2
5 -> 2,3,5,8,13,4,7,11
6 -> 3,5,8,13,4,7,11,2
7 -> 14,5,9
8 -> 13,4,7,11,2,3,5,8
9 -> 11,2,3,5,8,13,4,7
0 -> 0
14 -> 5,9,14
59 -> 5,9,14
Isso é código-golfe , então o menor número de bytes vence.
14
e59
dou o mesmo resultado. Se59
é interpretado como iniciando5,9
e permitindo que, como parte do loop, então certamente14
deve ser o início do loop?0,1,1,2,3,5,8,13,4,7,11,2,3
. A primeira vez que o loop se repete é na segunda2
.1,4,5,9,14,5
e5,9,14,5,9
. Ambos repetem começando com o segundo5
. Como eu disse anteriormente, apenas a entrada é dividida; os números posteriores mantêm seus dígitos juntos na sequência.Respostas:
Gelatina , 15 bytes
Experimente online!
Como funciona
fonte
Perl 6 ,
96 7875 bytes-3 bytes graças a nwellnhof
Experimente online!
0 retorna 0 e outro número retorna um objeto Match que se restringe aos números separados por um espaço com um espaço à direita à esquerda.
Explicação:
fonte
JavaScript (ES6),
111 104103 bytesExperimente online!
Comentado
fonte
Python 3 ,
1871761581391381291211201129695120116 bytesExperimente online!
Edit: Conforme observado por @ Jules , a solução mais curta se aplica ao Python 3.6+.Não há mais soluções distintas para Python 3 / 3.6+Editar: a indexação de
z
era muito detalhada. Sem isso, agora não há ganho no usoeval
.Editar: localização simplificada se os dois últimos elementos já apareceram na sequência.
Editar: formato de saída alterado da lista para tupla + substituído
lambda
pordef
Edit: Voltar
lambda
mas incorporadot
emf
.Editar: a entrada
n
pode ser realmente interpretada como chefe da coleção crescente, oz
que representaria uma cauda na abordagem recursiva. Também supera a solução da @ Arbo novamente.Editar: Na verdade, você pode descompactar dois itens da cabeça, o que corta outros 16 bytes.
Edit: Na verdade, 17 bytes.
Edit: Como observado por @ Arbo solução estava dando respostas
14
e59
casos como eles estavam em casos de teste inicial que foram provados mais tarde estar errado. Por enquanto, isso não é tão curto, mas pelo menos funciona corretamente.Bastante abuso de
f-strings
eeval
. Código original não-golfado, embora eu suspeite que possa ser feito de alguma maneira mais fácil:fonte
59
rendimentos(14, 5, 9)
C (gcc) ,
114112109 bytesExperimente online!
-3 de roofcat
Inclui um espaço à direita.
fonte
do...while
não precisa do aparelho se for uma única instrução O_oPerl 5,
9076 bytesTIO
fonte
Java (JDK) , 194 bytes
Experimente online!
Hardcoded parecia o mais curto, já que o Python já tinha uma resposta de 187 ...
fonte
Haskell, 100 bytes
Experimente online!
fonte
Python 2 ,
123114113 bytesExperimente online!
O programa constrói uma tupla
p
de todos os pares de 2 valores que ocorreram na sequência, que é inicializada com lixo eletrônico para salvar alguns bytes. A própria sequência é criada na tuplal
, e os dois últimos elementos dessa tupla são armazenadosb
para referência fácil (e curta). Assim que uma repetição é encontrada, podemos procurar o índice deb
inp
para saber onde o loop começou.EDIT: Limpei isso um pouco e eliminou mais um byte ... Meu método parece estar se aproximando do limite de contagem de bytes, e eu realmente deveria parar de trabalhar nisso.
fonte
Carvão , 46 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Digite o número, preencha com 2 caracteres, pegue a soma digital de cada caractere e salve a lista resultante.
Repita enquanto a lista de loops está vazia.
Calcule a soma dos dois dígitos anteriores e adicione-a à lista de Fibonacci.
Pegue todos os sufixos não triviais da lista.
Filtre aqueles que não se repetem e salve o resultado na lista de loops.
Lance a lista de loops para string e imprima.
fonte
Vermelho ,
189178164137 bytesExperimente online!
fonte
Python 2 ,
149139 bytesExperimente online!
Espera um número inteiro não negativo como entrada. Número de bytes menor, mas provavelmente não funcionará mais para números inteiros> 99.
Explicação:
fonte