Aqui está a sequência da qual estou falando:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
A partir de 1, mantenha 1, solte os 2 próximos, mantenha os 2 próximos, solte 3, mantenha 3 e assim por diante. Sim, também está no OEIS (A064801) !
O desafio
Dado um número inteiro n>0
, encontre o enésimo termo da sequência acima
Casos de teste
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
Isso é código de golfe, então a resposta mais curta em bytes vence! Boa sorte!
Respostas:
Java (OpenJDK 8) ,
4544 bytesExperimente online!
-1 byte graças a @Nevay
Depois de encarar isso por um tempo, notei um padrão. Toda vez que soltamos
n
números, o próximo número na sequência é um quadrado perfeito. Vendo isso, dividi mentalmente a sequência em pedaços convenientes:[[1],[4,5],[9,10,11],...]
basicamente, oi
th chunk começai*i
e itera para cima em busca dei
elementos.Para encontrar o
n
número th nesta sequência, queremos encontrar primeiro em qual bloco o número está e, em seguida, em qual posição ele ocupa. Nós subtrair o nosso número de incrementoi
den
atén
é inferior ai
(o que nos dá o nosso pedaço), e, em seguida, basta adicionarn-1
parai*i
obter a corretaposition
no pedaço.Exemplo:
fonte
return~-n+i*i;
para salvar 1 byte.Haskell,
484341 bytes4 bytes extras para indexação baseada em 1 em vez de baseada em 0. Uma restrição desnecessária, IMHO.
Experimente online!
fonte
Python 3 ,
4746 bytes1 byte graças ao Sr. Xcoder.
Experimente online!
MUITO rápido para números mais altos
fonte
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Não tenho certeza ... Abordagem inteligente!a*(a+1)
é par para todo número inteiro. O Python reclama da divisão de float em números inteiros? Ele reclama de operações bit a bit em carros alegóricos? Não se:(2*n)**.5+.5|0
.Gelatina , 8 bytes
Experimente online!
fonte
Haskell , 33 bytes
Uma função anônima. Use como
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Experimente online!
!!
. o0:
é um elemento fictício para ajustar a indexação baseada em 0 a 1.[n^2..n^2+n-1]
constrói uma subsequência sem lacunas, começando com o quadrado den
e contendon
números.do
notação concatena os intervalos construídos para todosn>=1
.fonte
Python 3 , 46 bytes
Experimente online!
fonte
Perl 6 , 43 bytes
Teste-o
Expandido:
(1..*).rotor({++$=>++$+1}...*)
produz:fonte
TeX, 166 bytes
Uso
fonte
Javascript,
4338 bytesExperimente online!
Uso o fato de que, para cada número triangular mais um, o resultado é um número quadrado.
Como exemplo: números triangulares são 0, 1, 3, 6, 10 ... então para 1, 2, 4, 7, 11 ... observamos 1, 4, 9, 16, 25 ... em nossa sequência .
Se o índice estiver em algum lugar entre esses números conhecidos, os elementos de nossa sequência avançam apenas um. Por exemplo, para calcular o resultado para 10, pegamos 7 (como um número triangular mais um), pegamos o resultado (16) e adicionamos 10-7 = 3. Assim, 16 + 3 = 19.
fonte
05AB1E , 12 bytes
Experimente online!
fonte
[0..a-1] + a**2
, a coisa legal aqui imo é apenas o emÝÁćn+
vez deD<Ýsn+
.cQuents , 27 bytes
Experimente online!
Atualmente, um exemplo da resposta em Python do Leaky , acho que existe uma maneira melhor.
fonte
Swift 3 , 72 bytes
Porta da minha solução Python .
Suíte de teste.
fonte
C # (Mono) , 164 bytes
Experimente online!
fonte
Mathematica, 37 bytes
Explicação
Function
que pega um número inteiro positivo#
e retorna a execução de#
números consecutivos na sequência.Produz a lista de todas essas execuções até a entrada
#
Flattens
a lista resultante e retorna o#
elemento th.fonte
Perl 5 , 33 + 1 (-p) = 34 bytes
Experimente online!
fonte
Tampio ,
310308 bytesUso:
4:n uni
avalia como9
.Explicação:
Da biblioteca padrão:
fonte
JavaScript (ES6), 33 bytes
Solução recursiva inspirada nas observações de Xanderhall .
Tente
fonte
Python 3 , 50 bytes
Experimente online!
fonte
Mathematica, 82 bytes
fonte
Python , 40 bytes
Experimente online!
Otimizando a expressão da Freira Furada .
Python , 41 bytes
Experimente online!
Expressão recursiva.
fonte
Javascript (ES6)
10098 bytesFiz isso rápido, então aposto que há muito espaço para melhorias, apenas loops e contadores básicos.
fonte
Retina , 27 bytes
Experimente online! Porto da resposta em Python do @ LeakyNun. O primeiro e o último estágios são apenas chatas decimais - conversão unária. O segundo estágio funciona assim:
((^1|1\2)+)
é um combinador de números triangular;$1
é o número triangular correspondente enquanto$2
é o seu índice. O final1
significa que ele corresponde ao maior número triangular estritamente menor que a entrada, resultando em exatamente uma iteração a menos do que o loop Python, o que significa que$1
é equivalente aa-i
e$2
parai-1
e sua soma éa-1
ou~-a
conforme necessário. ( para corresponder também nesse caso.$&
apenas impede que a correspondência seja excluída do resultado.) Observe que para uma entrada1
sem correspondência acontece e a saída é simplesmente a mesma que a entrada. Se você fosse perverso, poderia usar^((^1|1\2)*)1
fonte
MATL , 12 bytes
Experimente online!
Explicação
fonte
C (gcc) , 38 bytes
Usando o algoritmo de @ Xanderhall aqui
Experimente online!
fonte
PHP,
48 4237 + 1 bytesportado da resposta de Leaky Nun
Execute como pipe
-F
ou experimente online .abordagem direta, 42 + 1 bytes (portado da outra resposta de Leaky Nun )
Corra como tubo com
-nR
ou descomente acima de TiO.solução iterativa mais antiga, 48 + 1 bytes
fonte