Considere a seguinte sequência:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Parece bastante sem padrão, certo? Aqui está como isso funciona. Começando com 0
, salte n
números inteiros, n
iniciando em 1
. Esse é o próximo número na sequência. Em seguida, acrescente os números "ignorados" e que ainda não foram vistos em ordem crescente. Em seguida, incremente n
e pule do último número anexado. Repita esse padrão.
Então, por exemplo, quando chegamos 11
, chegamos n=5
. Aumentamos n
para ser n=6
, saltamos para cima e 17
, em seguida, acrescentamos, 13 14 15 16
pois eles ainda não foram vistos. Nosso próximo salto é n=7
, então o próximo elemento na sequência é 23
.
O desafio
Com base na entrada x
, imprima o x
termo th desta sequência, os primeiros x
termos da sequência ou crie uma lista infinita dos termos da sequência. Você pode escolher a indexação 0 ou 1.
E / S e regras
- A entrada e saída podem ser fornecidas por qualquer método conveniente .
- Pode-se presumir que a entrada e a saída se encaixam no tipo de número nativo do seu idioma.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Respostas:
JavaScript (ES7), 41 bytes
Retorna o n-ésimo termo da sequência, indexada em 0.
Experimente online!
Quão?
Caso principal:n > 3
Os quatro primeiros termos da sequência são especiais, então vamos colocá-los de lado por enquanto.
Para , a sequência é assim:n > 3
Podemos notar que, de fato, existem duas sub sequências intercaladas:
A maioria dos valores pertence à sub-sequência para a qual simplesmente temos:UMA
Alguns outros valores pertencem à sub-sequência (destacada entre colchetes no diagrama acima) cujos índices seguem a sequência aritmética 3, 3, 4, 6, 9, 13, 18, 24 ... e para a qual temos:B
onde é o índice da sequência principal e k é o índice da sub-sequência B .n k B
Os índices de na sequência principal são dados por:B
Dado , sabemos que o termo correspondente na sequência principal pertence a B se n for uma solução inteira da equação quadrática:n B n
cujo discriminante é:
e cuja solução positiva é:
Esperamos para ser um número inteiro. Daí o teste:Δ--√
Casos especiais:0 ≤ n ≤ 3
Para , o discriminante é negativo e obtém sua raiz quadrada em NaN . Para n = 3 , o discriminante é 1 . Portanto, estas quatro primeiros termos da sequência são considerados como pertencendo à sub-sequência B .n < 3 n = 3 1 B
Se apenas aplicarmos a fórmula padrão n - ~ d / 2 , obteremos:
ao invés de:
É por isso que nós XOR esses resultados com respectivamente.0 , 1 , 2 e 1
fonte
Casca , 12 bytes
Experimente online!
Saída como uma lista infinita. Aqui é uma versão que imprime o primeiro N .
Explicação
fonte
Haskell , 43 bytes
Experimente online!
Define uma lista infinita:
fonte
Gelatina , 15 bytes
Este é um programa completo que, dado n , imprime os primeiros n itens da sequência.
Experimente online!
Como funciona
fonte
C (gcc),
736764 bytesExperimente online!
Define uma função
f
que recebe indexação 0n
e produz on
número th na sequência.Podemos analisar a sequência da seguinte maneira:
Primeiro, lidamos com a seção do meio:
Observe que os argumentos à esquerda (4, 6, 9, 13, ...) seguem um padrão: primeiro adicione dois, depois adicione três, depois adicione quatro e assim por diante. Começamos em
t=4
e adicionamosd
(que começa em 2) a cada iteração do loop, incrementandod
o processo.O corpo do loop é mais interessante. Lembre-se de que queremos mapear 4 a 5, 6 a 8, 9 a 12, etc .; isso é apenas adicionar
d-1
sex
fort
. No entanto, essa lógica vem antes do último caso,f(n) = n - 1
então sabemos que vamos subtrair 1 no final. Portanto, podemos simplesmente adicionard
ifx == t
(x-t||(x+=d)
). No entanto, também terá de sair do loop imediatamente após este - então adicionamos que parad
obter o absurdo de aparênciad+=x+=d
, que vai sempre fazer ad<x
condição falhar.Isso cobre tudo, exceto os quatro primeiros valores. Olhando para eles em binário, obtemos:
Então, queremos virar o último bit se
2 <= x < 4
. Isso é realizado comx^x/2
.x/2
fornece o segundo bit menos significativo; portanto, XORing com o número original inverte o último bit se o número for 2 ou 3.fonte
Geléia ,
1310 bytes-3 Agradecimentos a Dennis (use a indexação 0 para salvar 2 da configuração da soma cumulativa e um decréscimo final)
Um link monádico que aceita um número inteiro, n indexado a 0 , que retorna um número inteiro, a (n)
Experimente online! Ou veja uma suíte de testes
fonte
ḶÄ+3i+’
, mas não fazia ideia de como lidar com os casos extremos.Ḷ»ạ¥3
queḊ3,2;
- parece que deveria haver um terser para esse trecho.Ḷ»2Äi+_>2$
economiza 3 bytes, com indexação baseada em 0.Perl 5 com
-pl
, 70 bytesExperimente online!
fonte
MATL , 22 bytes
Emite o primeiro
n
termos da sequência.Experimente online!
Explicação
fonte
Haskell , 51 bytes
Experimente online!
Um pouco mais do que a resposta de Lynn Haskell , mas a abordagem diferente pode ser interessante, no entanto.
fonte
Ruby , 73 bytes
Experimente online!
Função recursiva que retorna os primeiros x números da lista.
fonte
QBasic, 58 bytes
Saídas indefinidamente. Você pode adicionar um
SLEEP 1
loop interno ou torná-loLOOP WHILE b<100
ou algo parecido para ver os resultados.Isso basicamente implementa apenas as especificações. Observe que os números para os quais voltamos sempre serão os números entre o número saltado mais recentemente e o número saltado anterior a ele. Então, nós armazenar esses limites como
a
eb
e usar umFOR
loop para imprimir todos os números entre eles.fonte
05AB1E , 14 bytes
Experimente online!
fonte
R , 70 bytes
Experimente online!
F
constantes graças à sugestão @JADsetdiff
vez dex[x %in% y]
Versão anterior (79 bytes)
fonte
5 bytes
e causa vários avisos!F/T
não for redefinido na definição da função. (IIRC) não modifica o valor global deF/T
Python 2 , 123 bytes
Experimente online!
Dada a entrada x, imprima os primeiros x termos da sequência,
Estou aprendendo Python e esses desafios tornam as coisas mais interessantes.
Edit: raspar algum espaço em branco
fonte
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Gelatina , 16 bytes
Experimente online!
Um byte a mais do que a resposta Jelly existente, mas isso poderia ser um pouco de golfe.
RÄṬŻk²Ḋ$
talvez possa ser mais curto.18 bytes
Mais longo, mas diferente.
fonte
Ruby , 63 bytes
Experimente online!
Indexado a 0. Provavelmente pode ser jogado para baixo.
fonte
Perl 6 , 52 bytes
Experimente online!
Esta é uma expressão de gerador usando o
...
operador Ele procura lacunas na sequência anterior@_
por meio de((^max @_)∖@_).min.?key
:O
?
é necessário para o valor inicial que não possui a.key
. Se nenhuma lacuna for encontrada, ele adicionará n (aqui na$
variável) ao último valor da lista, mais um por 0 erros.fonte
Python 3 , 104 bytes
Experimente online!
Dada a entrada x, produza as primeiras x "sequências"
fonte