Sequências
Está dado quatro sequências de números, numerados 1
através 4
.
OEIS A localização de
0
quando os números naturais estão listados em binário. Aqui está um exemplo de como calcular a sequência:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
O início da sequência é assim:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Essa sequência inclui o primeiro número natural, pula os próximos dois, depois os três seguintes, depois os quatro seguintes e continua.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
OEIS Inteiros positivos em que o número de
0
's e o número de1
' s na representação binária do número são potências de2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
OEIS A sequência Q de Hofstadter .
a (1) = a (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) para n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
Pouco é provado rigorosamente sobre essa sequência, mas existem muitos resultados empíricos. Um é particularmente importante e você pode assumir que é válido para toda a série:
Este artigo observou que os elementos da série podem ser agrupados em gerações. Se os numerarmos começando em 1, a k- ésima geração conterá exatamente 2 k elementos. A propriedade relevante é que todos os números da geração k são obtidos somando dois números das gerações k-1 e / ou k-2 , mas nunca das gerações anteriores. Você pode usar esta (e somente essa) observação para colocar um limite inferior nos elementos restantes na sequência.
Desafio
Seu desafio é imprimir os primeiros x
números na interseção das seqüências de entrada fornecidas.
Entrada: Dois números separados por um espaço ativado STDIN
. O primeiro número é um número inteiro de 1
para 15
inclusivo, em que cada bit corresponde a uma sequência. O bit mais baixo corresponde à sequência 1
e o mais alto corresponde à sequência 4
. O segundo é a quantidade de números x
,, para saída STDIN
.
Saída: Os primeiros x
números que se cruzam com as seqüências de entrada fornecidas. Imprima os números STDOUT
com qualquer espaço em branco ou pontuação como delimitador (espaços, tabulações, novas linhas, vírgulas, dois pontos, pontos etc.).
Exemplos
1. Imprima os primeiros 3
números que estão em todas as seqüências.
Entrada: 15 3
Resultado: 10,23,40
2. Imprima os primeiros 12
números no número de seqüências 1
e 4
.
Entrada: 9 12
Resultado: 3,8,10,14,19,20,21,23,24,31,37,40
3. Imprima os primeiros 10
números em sequência 2
.
Entrada: 2 10
Resultado: 0,3,4,5,10,11,12,13,14,21
4. Imprima os primeiros 6
números nas seqüências 3
e 4
.
Entrada: 12 6
Resultado: 2,4,5,6,9,10
Detalhes
- Você pode imprimir a saída à medida que avança ou ao mesmo tempo no final.
Muito obrigado a todos que ajudaram com isso no chat! Esta questão se beneficiou muito de estar na caixa de areia .
fonte
12 5
exemplo até o mesmo índice, de10
fato vem antes9
na interseção ... como, como você passaria pelas seqüências, decidindo se deve pular a9
in # 3 como uma possível interseção? Como se o # 3 tivesse7
nele, seria necessário ignorá-lo, pois isso não aparece no # 4x
?Respostas:
Haskell,
495442402Ele executa razoavelmente bem. Aqui estão alguns exemplos de OP:
fonte
Python 3,
590639 caracteresEsta é a solução direta: use geradores para definir cada uma das infinitas seqüências e, desde que a interseção não seja grande o suficiente, adicione uma etapa a cada sequência.
Para dar conta da sequência de Hofstadter que não aumenta monotonicamente: em cada etapa, gero o dobro dessa sequência, por exemplo, 1, depois 2, 4, 8, 16, 32 etc. Acho que satisfaz o limite indicado na pergunta , e ainda é rápido o suficiente para todos os casos de teste apresentados lá.
fonte
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(Eu nem acho que essa função a torne mais curta ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
C #, 1923
Provavelmente não será o programa mais curto, mas achei o desafio interessante, então aqui está a minha solução.
A execução dos 4 com 35 números (15 35) leva cerca de 5 segundos.
Você pode testá-lo aqui , mas observe que, se desejar o OEIS4, a quantidade de dígitos que você deseja precisará ser pequena ou o netfiddle ficará sem memória.
Golfe
Legível
Explicação
Isso faz uso de bigtime de avaliação preguiçosa, o que o torna muito rápido e acredito. Também estava com preguiça de fazer qualquer "bitlogic" usando o método Convert.ToString (number, 2) do framework. Isso transforma qualquer número em sua representação em binray como uma string.
Eu tive que escrever meu próprio método para interceptar as suas seqüências, pois o Linq-Method intersect calcula a interseção da sequência completa, e isso era literalmente impossível.
fonte