Vamos contar...
Conte até 2 e volte para 1
Conte até 4 e volte para 1
Conte até 6 e volte para 1
... ok, você conseguiu ...
junte tudo isso e você terá a seguinte sequência
{1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}
Desafio
Dado um número inteiro n>0
para indexado em 1 (ou n>=0
para indexado em 0), imprima o enésimo termo dessa sequência
Casos de teste
Input->Output
1->1
68->6
668->20
6667->63
10000->84
Regras
seu programa deve ser capaz de calcular soluções de até n = 10000 em menos de um minuto
Isso é código-golfe , então o código mais curto em bytes vence!
Respostas:
JavaScript (ES7),
59 ... 4443 bytesGuardado 1 byte graças a Titus
Entrada esperada: 1 indexada.
Inicialmente inspirado por uma fórmula para A004738 , que é uma sequência semelhante. Mas acabei reescrevendo por completo.
Casos de teste
Mostrar snippet de código
Quão?
A sequência pode ser organizada como um triângulo, com a parte esquerda em ordem crescente e a parte direita em ordem decrescente.
Abaixo estão as primeiras 4 linhas, contendo os 32 primeiros termos:
Agora, vamos apresentar algumas variáveis:
Começamos com 2 elementos na parte superior e adicionamos 4 elementos em cada nova linha. Portanto, o número de elementos na linha indexada 0 r pode ser expresso como:
A posição inicial indexada 1 x da linha r é dada pela soma de todos os termos anteriores nesta série aritmética mais um, o que leva a:
Reciprocamente, dada uma posição indexada em 1 n na sequência, a linha correspondente pode ser encontrada com:
ou como código JS:
Uma vez que conhecemos r (n) , subtraímos a posição inicial x (r) menos uma de n :
Comparamos n com a (r) / 2 + 1 = 2r + 2 para descobrir se estamos na parte ascendente ou na parte descendente:
Se essa expressão for verdadeira, retornamos n . Caso contrário, retornamos 4 (r + 1) - n . Mas como r já foi incrementado na última instrução, isso é simplificado como:
fonte
Haskell , 37 bytes
Experimente online!
Indexado a zero. Gera a lista e os índices nela. Obrigado a Ørjan Johansen por economizar 2 bytes!
Haskell , 38 bytes
Experimente online!
Indexado a zero. Gera a lista e os índices nela.
Haskell , 39 bytes
Experimente online!
Indexado a zero. Um método recursivo.
fonte
Python , 46 bytes
Experimente online!
Zero indexado.
fonte
Casca , 8 bytes
1 indexado. Experimente online!
Explicação
fonte
Perl 6 , 29 bytes
Experimente online
Baseado em 0
Expandido:
A sequência interna
1...$+=2...2
produzPara que seja baseado em 1, adicione
0,
antes do segundo{
ou-1
depois$_
fonte
R, 64 bytes
Função que aceita um argumento
n
. Ele cria um vetor2:n
com incrementos de 2. Para cada um deles, o vetor1:(x-1)
ex:2
é criado. Isso no total será maior quen
. Nósunlist
, para obter um vetor e pegar an
-ésima entrada.fonte
1:n*2
vez deseq(2,n,2)
? Será maior do que você precisa, mas tudo bem! Também não acho que isso funcionouseq(2,n,2)
den=1
qualquer maneira!Python 2 , 56 bytes
Experimente online!
Este é o índice 0.
-1 byte graças a @JustinMariner
Como isso funciona
Observamos que o 1 º
n
grupo indexado (1, 2, ... 2n ..., 2, 1
) ocorre de elementos numerados como 0 indexados2(n-1)^2
a2n^2
.Para encontrar o elemento no índice
x
, podemos encontrar o número do grupon
quex
está dentro. A partir disso, calculamos a distância do centro do grupo quex
está. (Esta distância éabs(2*n**2+2*n+2-x)
).No entanto, como os elementos diminuem mais para longe do centro de um grupo, subtraímos a distância do valor máximo do grupo.
fonte
print 2*n-abs(2*n*n+2*n+1-x)+2
-2*n*n+2*n
pode ser2*n*-~n
e+2+2*n
pode ser transformado em-~n*2
, o que nos permite movê-lo para o início o que economiza bytes ( 53 bytes )05AB1E , 8 bytes
Código:
Usa a codificação 05AB1E . Experimente online!
Explicação:
fonte
€1
é estranho ...JavaScript, 39 bytes
fonte
Geléia ,
10, 9 bytesExperimente online!
Também indexado, e termina muito rápido.
Um byte economizado graças a @ErikTheOutgolfer!
Explicação:
Hipoteticamente, digamos que a entrada (
a
) seja 3.fonte
Ḥ€ŒḄ€Ṗ€Fị@
, então você pode usarµ€
para -1 (três ou mais mônadas com€
no início):ḤŒḄṖµ€Fị@
ḤŒḄṖ
<newline>½ĊÇ€Fị@
para 12 a cumprir o requisito 10.000 (executando o código 9 byte leva localmente cerca de 2:20 no meu i7 e usa 7GB)MATL , 15 bytes
Baseado em 1.
Experimente online!
Isso expira nos maiores casos de teste do TIO, mas termina no meu computador desktop (compilador executado no MATLAB R2017a). Para exibir o tempo decorrido, adicione
Z`
no final do código.Explicação
O código gera muitos mais termos do que o necessário. Especificamente, ele calcula
n
"peças" da sequência, onde cada peça é uma contagem até 1.fonte
Casca ,
1210 bytesExperimente online!
Indexado em 1, funciona muito rápido
Explicação
fonte
…
Mathematica, 90 bytes
Experimente online!
fonte
Retina , 62 bytes
Experimente online! O link inclui casos de teste. A entrada é indexada em 1. O primeiro estágio é apenas a conversão decimal para unária. O segundo estágio encontra o número quadrado mais alto
s
estritamente menos da metade den
;$1
és²
, enquanto$2
é2s-1
. Ele calcula dois valores, primeiro o número de números na execução atual de subida / descida, que é4(s+1) = 4s+4 = 2$2+6
, e em segundo lugar a posição dentro dessa execução, ou sejan-2s² = n-(2$1+1)+1 = n-$&+1
, que requer apenas um1
para compensar o1
usado para impor a desigualdade estrita. O estágio final conta a partir dessa posição até o início e o final da corrida, pega o resultado mais baixo e o converte em decimal.fonte
Mathematica, 67 bytes
Experimente online!
fonte
Perl 5 , 43 + 1 (-p) = 44 bytes
Experimente online!
Eu estava trabalhando em uma fórmula para calcular o n-ésimo elemento diretamente. Então vi que o @ fireflame241 havia feito esse trabalho e joguei no Perl.
# Perl 5 , 50 + 1 (-n) = 51 bytesExperimente online!
Os resultados são 0 indexados.
fonte
Haskell ,
11581 bytesExperimente online!
Há alguma mágica acontecendo aqui. Provavelmente poderia ser mais curto se eu usasse uma abordagem normal.
Explicação
Primeiro nós definimos
%
.%
é uma função que aceita duas variáveisx
ey
. Ele constrói uma listascanl(+)y[y+1,y+3..]
e encontra o primeiro elemento dessa lista maior quex
.scanl(+)
apenas realiza somas iterativas, para obter os números triangulares que faríamosscanl(+)0[1..]
, para obter os números quadrados que faríamosscanl(+)0[1,3..]
. As duas listas em particular que iremos construir sãoscanl(+)2[3,5..]
escanl(+)1[2,4..]
estes são os pontos de inflexão do padrão.Agora vamos definir a função principal
g
que recebe umx
. Sex
for um, retornamos1
porque esse é o primeiro valor. Caso contrário, verificamos os próximos dois pontos de inflexão; se a inflexão descendente for maior1%x>2x
, retornamos o sucessor de,g$x-1
caso contrário, retornamos o predecessor deg$x-1
.Ok, mas por que isso funciona?
Primeiro de tudo "O que há com a maneira como encontramos vértices?". É importante observar a distância entre vértices consecutivos do mesmo tipo. Você notará que as diferenças aumentam 2 por vez. Isso faz sentido porque as bases dos triângulos se tornam mais amplas em 2 a cada vez. Podemos fazer uma lista constante diferença usando uma lista literal assim
[2,4..]
e usamosscanl(+)
transformar essas listas em nossas listas de vértices, com base na localização do primeiro vértice e da primeira diferença.Portanto, agora que temos uma maneira de encontrar vértices para cima e para baixo, podemos usar essas informações para obter os valores. Dizemos que o primeiro valor é o
1
contrário, temos que pegar o sucessor ou o predecessor. Se o próximo vértice for ascendente, queremos assumir o predecessor, caso contrário, o sucessor.Haskell ,
565146 bytesAqui está minha melhor solução com menos matemática e menos bytes.
Experimente online!
fonte
Pyke , 14 bytes
Experimente aqui!
fonte
C # (.NET Core) , 120 bytes
Explicação: bastante simples, o primeiro loop aninhado sobe até o máximo, o segundo desce novamente para 2. A repetição para cada múltiplo de 2.
Experimente online!
fonte
Ruby ,
7875 bytesGuardado 1 byte graças a Step Hen
Economizou 1 byte graças ao Sr. Xcoder
Experimente online!
Espero conseguir algumas dicas para diminuir ainda mais o número de bytes. Eu tentei adotar uma abordagem simples.
fonte
c=1 if
pode ser jogado parac=1if
->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Java (OpenJDK 8) , 53 bytes
Experimente online!
-2 bytes graças a Nevay.
1 indexado.
TL; DR Dividimos a sequência em pedaços convenientes, localizamos o pedaço
n
e encontramos anth
posição no pedaço.Aqui, podemos dividir a sequência como
[[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]
, o que nos fornece tamanhos de partes de4i-2
. Começando comi=2
, subtraímosi
den
, essencialmente movendo para cima um pedaço de cada vez. Quando satisfazemosn<=i
, sabemos quen
agora é a posição do valor correto no pedaço atual.Em seguida, obtemos o valor comparando
n
comi
o tamanho do bloco. O ponto médio de cada pedaço é igual ai/2+1
; sen
for menor que isso, simplesmente retornamosn
. Sen
for maior, retornamosi-n+2
.Exemplo
fonte
+1
,return n>i/2?i-n+2:n
é suficiente.Python 2 , 5! bytes (120 bytes: P)
Experimente online!
Simples, faz a lista e depois pega o elemento input'th
fonte
Python 3 ,
184156 bytesExperimente online!
jogou golfe com o gerador Python para avaliação "preguiçosa"
fonte
QBIC , 47 bytes
Explicação
fonte
Röda , 54 bytes
Experimente online!
Ligue para:
try f(n)
Essa função retorna rapidamente a resposta, mas depois disso faz alguns cálculos desnecessários e acaba ficando sem memória.
Como a função retorna a resposta real logo após ser chamada (claramente em menos de um minuto), acho que essa resposta é válida.
(No Röda, as funções podem retornar valores antes de sair devido ao paralelismo.)
fonte
C # (.NET Core) ,
99 9586 bytesExperimente online!
Função Lambda que pega e retorna um número inteiro. Loop único que lida com a contagem para cima e para baixo.
fonte
PHP, 65 + 1 bytes
Executar como tubo com
-R
ou tente online (ou remova o comentário de uma das outras versões).Uma porta do JavaScript recursivo do tsh leva 66 bytes:
Um porto da solução da Arnauld leva 62 + 1:
Uma porta golfada do Java de Xanderhall tem o código mais curto até agora (55 + 1 bytes):
fonte
Pitão ,
1918 bytesExperimente aqui!
fonte