Começamos com uma sequência indexada em branco 1:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
Na nésima etapa, preenchemos todos os espaços em branco a (n) com números inteiros maiores que 1 começando no primeiro espaço em branco restante, onde a (n) é a nésima entrada da sequência.
Após o primeiro passo:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Observe que a (1) deve ser 2 porque o primeiro número inteiro maior que 1 é 2.
Na segunda etapa, preenchemos todos os a (2) espaços em branco. Será evidente que a (2) deve ser 2.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
Na terceira etapa, preenchemos todos os a (3) espaços em branco. A partir da sequência, a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
Na quarta etapa, preenchemos todos os a (4) espaços em branco. A partir da sequência, a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Eventualmente:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Tarefa
Dado n, retorne o n- ésimo elemento da sequência.
Os primeiros 10.000.000 de termos da sequência podem ser encontrados aqui .
Isso é código-golfe . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .
Respostas:
Haskell ,
8067 bytesExperimente online!
Haskell é a linguagem perfeita para definir uma lista infinita em termos de si mesma.
fonte
let
guardas de padrões.pattern1 | let pattern2 = expr2 = expr1
significa a mesma coisa quepattern1 = let pattern2 = expr2 in expr1
(pela mesma razão que[expr1 | let pattern2 = expr2]
significa a mesma coisa que[let pattern2 = expr2 in expr1]
).let
protetores de padrões (especialmente que eles podem executar funções)! Além disso,m=2:2:2`drop`g m
é um byte mais curto.(!!)$0:m
é dois bytes mais curto.2:2:
tudo com um pouco mais de preguiça:g ~(a:b)|...
em=g m
.C, 123 bytes
Experimente online!
Passo a passo
Aloque uma matriz de n números inteiros para armazenar os primeiros n elementos da sequência. Isso codifica
sizeof(int)
como4
, que é uma suposição segura na maioria dos casos e certamente uma que estou disposto a fazer no contexto do código de golfe. :)Estes são todos os contadores:
i
para o índice da etapa em que estamos,j
percorrer a sequência procurando por espaços vazios ek
contar quantos espaços vazios foram vistos.Antes de iniciarmos nosso loop principal, nos esgueiramos na inicialização dos dois primeiros elementos da sequência para
2
. (p[0]
=*(p + 0)
=*p
.) Isso joga fora a contagem parak
, porém, mas ...... também fazemos uma inicialização sorrateira de
k
, que testa para ver sei
é menor que2
e corrige o valor inicial dek
se for. O loop interno também começa aqui, que itera toda a sequência até o momento durante cada etapa.Essa linha poderia realmente usar algumas explicações. Podemos expandir isso para:
por curto-circuito e, em seguida, pelas leis de De Morgan e pelo fato de
0
ser falso em C:Isso basicamente afirma: "se esse espaço estiver vazio, aumente
k
. E sek
anteriormente era um múltiplo do tamanho da etapa, execute a seguinte instrução". Portanto, executamos a instrução em todos os elementos de tamanho de etapa , que é exatamente como a sequência é descrita. A afirmação em si é simples; Tudo que faz é gerar2
,3
,4
, ....Usando o complicado-return-sem-um-retorno que funciona com
gcc
, nós "devolver" o último elemento dos primeiros n termos na seqüência, que passa a ser o n º prazo.fonte
Pitão, 29 bytes
Experimente online
Como funciona
Em vez de brincar com listas, isso usa uma fórmula recursiva simples.
fonte
Haskell , 67 bytes
Experimente online!
Uma solução aritmética recursiva que resultou basicamente no mesmo método da resposta Pyth de Anders Kaseorg .
Esse código é coberto de verrugas - partes feias que parecem poder ser jogadas fora, mas eu não vi como.
A função
i%j
realmente deseja usar uma proteção para verificar semod i(f j)>0
e avaliar uma das duas expressões correspondentes. Mas, ambas as expressões usamdiv i(f j)
. Vincular isso a um guarda não o fará aplicar aos dois lados. Tanto quanto eu sei, um guarda não pode ser feito para "distribuir" sobre outros guardas.let
ewhere
são muito longos. Portanto, o código usalast
para escolher uma das duas expressões enquanto o guarda vincula a variável. Ugh.Idealmente, usaríamos
divMod
porque thediv
emod
são usados, mas(d,m)<-divMod ...
é uma expressão longa. Em vez disso, verificamos hackilymente que o mod é diferente de zero, verificando se odiv
valor vezes o divisor fica aquém do valor original.O
0%j=2
caso não seria necessário se Haskell tivesse um curto-circuitodiv 0
, o que não acontece. O.pred
converte a entrada indexada em 1 em indexada a zero, ou então haverá-1
correções em todos os lugares.fonte
%
indexado em 1, precisará de uma correção de cinco bytes - o que significa apenas empate. No entanto , você pode incorporá-f
lo%
sem custo ef
tornar - se anônimo, economizando dois bytes no total.f
sem perder bytes.divMod
parece ser um byte mais barato, porque permite ramificações!!(0^m)
. Até agora eu tenho:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 bytesUma função recursiva que para assim que o resultado está disponível.
Versão alternativa, 90 bytes
Sugerido por Shaggy para -1 byte
Este deve ser chamado com
f(n)()
. Embora o post correspondente na meta atualmente dê uma pontuação positiva, essa sintaxe é aparentemente contestada.Demo
Mostrar snippet de código
fonte
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
deve funcionar para 92 bytes. Ligue comf(n)()
.Java 8, 124 bytes
Expressão lambda.
Cria uma matriz inteira e a preenche continuamente até o enésimo valor ser preenchido.
Pré-declarar variáveis na parte superior para reduzir o maior número possível de declarações, pois cada uma
int
custa 4 bytes de espaço em vez de adicionar,n
2.Na
j
'ª iteração do cálculo, o número de' espaços em branco 'que é necessário pular é igual aa[j]
(ou 2, se estiver em branco). Conclui que, se o primeiro espaço em branco que precisamos preencher estiver na posiçãok
,k * a[j]
nos dará o 'passo' (s
).fonte