Você provavelmente está familiarizado com a sequência de Fibonacci, onde os dois primeiros termos são 0, 1
(ou algumas vezes 1, 1
) e todos os termos seguintes são a soma dos dois anteriores. Começa assim:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Às vezes, a sequência contém números que têm um padrão específico que eu acho interessante: a diferença entre qualquer par de dígitos adjacentes é a mesma que qualquer outro par. Por exemplo, na sequência que começa com 0, 1
, o 18º termo é 987
. 9-8=1
e 8-7=1
. Estou levemente satisfeito.
Desafio
Dados dois valores iniciais F(0)
e F(1)
, imprima todos os números na sequência gerada por F(n) = F(n-1) + F(n-2)
isso atendem aos seguintes critérios:
- A diferença entre qualquer par de dígitos adjacentes é a mesma que qualquer outro par
- Tem pelo menos três dígitos (os números de 1 e 2 dígitos não são interessantes para esse padrão)
Entrada
- Dois números inteiros não negativos menores que 10 ** 10 (10 bilhões)
Resultado
- Todos os números inteiros inferiores a 10 ** 10 e atendem aos critérios na seção Desafio
- É aceitável enviar dígitos maiores que 10 ** 10, mas não é um requisito
- Dado que dígitos repetidos atendem ao padrão (por exemplo,
777
), é possível que haja números infinitos que atendam aos critérios, mas não é necessário que seu programa seja emitido para sempre - Se não existirem números inteiros, imprima o que quiser, desde que não seja um número (nada, nulo, matriz vazia, mensagem de erro, cara triste etc.)
- Se um número correspondente ao padrão aparecer mais de uma vez na sequência, você poderá produzi-lo uma vez ou quantas vezes ocorrer
- Se alguma entrada atender aos critérios, ela deverá ser incluída na saída
Regras
- Entrada e Saída podem estar em qualquer formato padrão
- As brechas padrão são proibidas
- Isso é código-golfe, então o código mais curto em bytes vence
Exemplos / Casos de Teste
Input , Output
[1,10] , []
[0,1] , [987]
[2,1] , [123]
[2,3] , [987]
[61,86] , [147]
[75,90] , [420]
[34,74] , [1234]
[59,81] , [2468]
[84,85] , [7531]
[19,46] , [111]
[60,81] , [222]
[41,42] , [333]
[13,81] , [444]
[31,50] , [555]
[15,42] , [666]
[94,99] , [777]
[72,66] , [888]
[3189,826] , [888888888]
[15,3] , [159,258]
[22,51] , [321,1357]
[74,85] , [159,4444]
[27,31] , [147,11111]
[123,0] , [123,123,123,246,369]
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]
[33345,692] , [987654321]
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]
[1976,123] , [123, 2222, 4321, 6543, 45678]
[1976, 123] -> [123, 2222, 4321, 6543, 45678]
,[3189, 826] -> [888888888]
,[33345, 692] -> [987654321]
Respostas:
MATL , 14 bytes
Obrigado a Emigna por apontar um erro, agora corrigido
Loop infinito que gera os números à medida que são encontrados.
Experimente online! Observe que, no intérprete online, os resultados são exibidos após o tempo limite de 1 minuto.
Explicação
Deixe
F(n)
eF(n+1)
denote dois termos consecutivos genéricos da sequência de Fibonacci. Cada iteração do loop começa com a pilha que contémF(n)
,F(n+1)
para algunsn
.fonte
05AB1E ,
171615 bytesExperimente online!
Explicação
fonte
JavaScript (ES6),
858481 bytesExperimente online!
Testando dígitos adjacentes
Ambos x e d são inicializados para uma função anônima, que as forças
NaN
de todas as operações aritméticas eles estão envolvidos. A primeira iteração dosome()
sempre dá(d = [function] - n) === NaN
e(r = [function] - d) === NaN
(Falsas). Na segunda iteração, temosd = x - n
(um inteiro) e(r = NaN - d) === NaN
(falsy novamente). A partir da terceira iteração, r é definido como um número inteiro diferente de zero se a diferença entre o dígito nº 3 e o dígito nº 2 não for igual à diferença entre o dígito nº 2 e o dígito nº 1.O número p está de acordo com os critérios exigidos se e somente se
some()
for falso (todos os dígitos adjacentes têm a mesma diferença) e o valor final de r é 0 (houve pelo menos três iterações). Isso dá!false / 0 === true / 0 === Infinity
(verdade).Caso contrário, podemos ter:
!true / r
com r> 0 ou r <0 , o que fornecefalse / r === 0
(falso)!false / NaN
, o que dátrue / NaN === NaN
(falso)Condição de parada
A recursão para quando
p | q
avalia como 0 . É garantido que isso acontece quando p e q atingem valores em torno de 10 25, com 84 bits de comprimento. Como o JS possui 52 bits de mantissa, os últimos 32 bits são zerados. Portanto, o OR bit a bit de 32 bits é avaliado como 0 .Devido à taxa de crescimento rápido da sequência, isso acontece rapidamente.
fonte
Java 8,
151144140136130 bytesLoop infinito emitindo os números quando os encontrar.
Experimente online (o tempo limite termina após 60 s).
Versão de 136 bytes com limite 10 10 adicionado (
a<1e10
):Experimente online.
Explicação:
fonte
Geléia ,
20 1918 bytesExperimente online!
+ƝḢ;Ɗȷ¡
produz os primeiros mil (ȷ
) termos da série que sempre serão suficientes. Eu acho que provavelmente existe uma maneira mais curta de fazer isso.+ȷ¡
fica perto, mas só funciona se o primeiro termo for zero.Estou assumindo que podemos pegar os dois números ao contrário, o que permite um byte
DIE
.Se não formos obrigados a produzir uma das entradas:
Gelatina , 15 bytes
Experimente online!
fonte
DIEƊ
durante o processo de golfe.Oitava ,
919083 bytesGuardado 7 bytes graças a Luis Mendo!
Experimente online!
Bem, funciona!
eval
com for loop dentro para economizar alguns bytes. Ignorando dois pontos e ponto e vírgula para economizar alguns. Usa o fato de que um vetor é considerado verdadeiro se todos os elementos são diferentes de zero para salvarany
ouall
.Fora isso, é praticamente uma implementação direta de Fibonacci.
fonte
Python 2 ,
10298 bytesExperimente online!
Thx para 4 bytes de ovs
fonte
Haskell , 105 bytes
Define o operador
(%)
que retorna uma lista infinita com todas as soluções. Para realmente ver o resultado no stdout , precisamos desativar o buffer (ou executá-lo noghci
ou comrunhaskell
), tente online!Explicação / Ungolfed
A função
f
é apenas uma função auxiliar que espera uma função binária e uma lista; aplica a funçãog
a todos os pares adjacentes. É essencialmente o mesmo que:O operador
(%)
é apenas uma compreensão da lista que faz alguma filtragem (certificando-se de que haja pelo menos três dígitos e que os dígitos adjacentes tenham a mesma distância):fonte
CJam , 55 bytes
Experimente online!
Minha primeira submissão ao CJam, não muito curta, mas muito divertida. Todas as sugestões são bem-vindas!
fonte
Stax ,
2624 bytesExecute e depure
Explicação
Não é tão curto quanto eu gostaria e provavelmente pode ser um pouco mais jogado, mas funciona.
fonte
Ruby , 79 bytes
Experimente online!
fonte
Julia 0.6 ,
8681 bytesExperimente online!
Bem direto - verifique se a entrada tem pelo menos 3 dígitos (
n>99
), então pegue a diferença entre cada par de dígitos no número (diff(digits(n))
), verifique se o comprimento de (endof
) um conjunto exclusivo de (∪
) essas diferenças é 1 (ou seja, todas as diferenças são iguais) e, se houver, imprima o número. Faça isso para os dois números indicados e chame recursivamente a função com os próximos dois números.(Infelizmente, parece que elaAgora sobrecarrega o±
tem precedência mais alta do que+
, ou a chamada final poderia tera+b±a+2b
economizado 3 bytes.)<
operador, economizando, assim, os bytes do operador e os colchetes de precedência. (Não é possível usar<
em nosso código, apenas reorganizeiendof(...)<2
para2>endof(...)
).Se alguma saída estranha for permitida, podemos salvar 2 bytes usando em
@show
vez deprintln
, imprimindo emn = 987
vez de apenas987
. Poderíamos usar atédump
1 byte menor que isso, masdump
imprime as informações de tipo junto com o valor, para que a saída seja emInt64 987
vez de apenas987
.fonte