(Desafio retirado de um jogo multiplayer (confronto de código) em codingame.com )
O desafio
Encontre o n- ésimo termo da seguinte sequência: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...
ou, para torná-lo mais óbvio,{1}, {1,2}, {1,2,3}, {1,2,3,4}...
A sequência é composta de intervalos concatenados de 1 a x , começando em 1, até o infinito.
Regras / IO
A entrada e a saída podem estar em qualquer formato, desde que sejam distinguíveis. A entrada pode ser obtida de qualquer fonte apropriada: STDIN, arquivo, etc ...
A entrada pode ser indexada em 0 ou 1 e a indexação selecionada deve ser mencionada na publicação.
Você precisará manipular pelo menos até um resultado de 255 inclusive (o que significa que a entrada máxima indexada em 0 é 32640). Qualquer coisa além disso deve ser tratada, se o seu idioma suportar.
É code-golf
assim que a menor contagem de bytes vence!
Casos de teste (indexação baseada em 0)
0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12
59
,100
, etc.)Respostas:
05AB1E , 5 bytes
O programa é indexado em 0, código:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
GNG¹¾¼QiN
é uma abordagem iterativa, mas mais inteligente.Haskell ,
2726 bytesExperimente online!
Obrigado @DanD. para -1 byte!
Esta é uma função anônima, criando a sequência infinita de apenas retornar o
n
elemento -ésimo mesmo:[[1..k]| k<-[1..]]
produz uma lista infinita de lista:[[1],[1,2],[1,2,3],[1,2,3,4],...]
. Para concatená-las, podemos escrever[z|k<-[1..],z<-[1..k]]
quais resultam[1,1,2,1,2,3,1,2,3,4,...]
e finalmente(...!!)
aceitam a entradan
(notação sem sentido) e retornam on
-ésimo termo (com base em 0).fonte
concat
com mais compreensão só economiza 1 byte:([z|k<-[1..],z<-[1..k]]!!)
.JavaScript,
2928 bytes-1 byte graças a Arnauld!
Usa a fórmula recursiva indexada em 0 encontrada no OEIS.
Quando chamado com 1 argumento conforme o esperado, o valor padrão do segundo
m
,, seráundefined
. No entanto,-~undefined
retorna 1, que permite que a recursão sejam = 1
executada sem um explícito na lista de argumentos (obrigado @Arnauld!)Snippet de teste:
Como alternativa, para a mesma contagem de bytes, podemos ter uma função ao curry da seguinte forma:
Você pode chamar isso com
f(5)()
- ele retorna uma função que, quando chamada, retorna o resultado, conforme descrito nesta meta post .fonte
Geléia , 5 bytes, 1 indexado
Experimente online!
Explicação:
fonte
Oitava, 39 bytes
1- índice baseado
Explicação:
Considere esta sequência:
se contarmos o número de elemento de subsequências, temos
então, usando a fórmula de Gauss para número triangular , podemos formar uma fórmula para z:
que é uma equação quadrática se resolvermos por n temos
Experimente Online!
fonte
Haskell,
2524 bytesExemplo de uso:
((!!)$[1..]>>= \x->[1..x]) 10
->1
. Experimente online! .Mapeia a função anônima de fazer uma lista de 1 para x
\x->[1..x]
(o internoenumFromTo 1
é um byte a mais) para a lista infinita[1..]
e concatena as listas resultantes em uma única lista.!!
escolhe o enésimo elemento.Graças a @flawr por um byte.
fonte
(!!)$[1..]>>= \x->[1..x]
. Às vezes eu realmente gostaria que houvesse uma maneira inútil menor da escrita\x->[1..x]
:)<$>
que não está no escopo. Você conhece algum compilador / intérprete Haskell on-line que use a versão mais recente? haskell.org permite apenas expressões e você não pode criar links para o código digitado.Oitava , 39 bytes
Experimente online!
Isso usa uma abordagem alternativa.
Por exemplo,
n=1
issoA=triu(v'+0*v)
cria a matrizAo remover todos os elementos zero e anexar as colunas
A(A>0)
, obtemos a sequência:Então, é apenas uma questão de extrair o
n
-ésimo termo dessa sequência.fonte
Python ,
3936 bytes-3 bytes graças a Dennis!
Um lambda recursivo que usa indexação baseada em 1.
Experimente online!
Nós acompanhamos o tamanho atual do "aumento" usando
m
. Sen
for menor ou igual am
, ele se encaixa no atual "aumento" e, portanto, o devolvemos. No entanto, se for maior quem
,m
afastamos-o, adicione 1m
e chame a função recursivamente (passando para a próxima subida).fonte
R, 25 bytes
O índice é baseado em 1.
fonte
sequence
resposta e fiquei feliz em ver isso.Pitão ,
65 bytes1 byte salvo graças a @TheBikingviking!
Isso usa indexação baseada em 0.
Experimente online!
Explicação
fonte
.n
pors
.Mathematica,
2724 bytesObrigado @MartinEnder por 3 bytes!
1 indexado. Isso gera erros que são seguros para ignorar.
Explicação
fonte
Join@@
é muito caro;)((r=Range)@r@#<>1)[[#]]&
StringJoin
não é avaliado ... eu gosto dissobrainf * ck, 78 bytes
Recebe entrada (com base em 0) e saídas como valores de bytes.
Você pode testá-lo aqui.
A entrada requer um
\
número decimal anterior (por exemplo,\10
para 10). Se a saída for um caractere ASCII imprimível, você deverá vê-lo. Caso contrário, clique em ver memória -> despejo final. O valor impresso está na 3ª célula (número da célula 2).Explicação:
Célula 0 (ENTRADA): é a entrada e é decrementada minha 1 cada vez que passa pelo loop.
Célula 1 (RESET): aumenta em 1 toda vez que é igual a TERM. Para fazer isso, sempre que adicionamos 1 ao loop, subtraímos 1.
Célula 2 (TERM): aumenta em 1 a cada loop e é definido como 0 se corresponder a RESET. Para fazer isso, copio apenas o valor de HOLD se essa célula não for igual a RESET.
Célula 3 (EQUAL): é usada para verificar se RESET e TERM são iguais.
Célula 4 (HOLD): é usada para copiar os valores de RESET e TERM de volta após a verificação de igual.
fonte
Pyke, 6 bytes
Experimente aqui!
Indexado a 0.
fonte
R,
4341 bytesEdit: Encontrou uma abordagem recursiva mais curta usando A002262 + 1 (0 indexado):
Versão antiga:
Fórmula 1-indexada da OEIS.
fonte
Perl 6 , 21 bytes
Indexado a 0. Experimente online!
Como funciona:
Perl 6 , 21 bytes
Indexado a 0. Experimente online!
Como funciona:
fonte
Nenhuma dessas soluções é tão curta quanto a de JungHawn Min , mas são abordagens alternativas, o que é algo que eu acho. Ambas são funções sem nome, recebendo uma entrada inteira positiva (indexada em 1) e retornando um número inteiro positivo.
Mathematica, 30 bytes
Uma fórmula matemática real para esta função! Feita mais legível (em parte, ao traduzir os caracteres de 3 bytes
⌈
,√
e⌉
):Ceiling[Sqrt[2 * #] - 1/2]
nos diz a qual sublista a entrada se refere, da qual subtraímos uma para nos dizer qual sublista termina antes de chegarmos à entrada; depois((#^2 + #) / 2 &)
calcula quantos elementos ocorrem em todas as sublistas anteriores àquela com a qual nos preocupamos, que subtraímos da entrada#
para obter nossa resposta. (Alguns notarão a fórmula familiar(#^2 + #) / 2
para o#
th número triangular;Ceiling[Sqrt[2 * #] - 1/2]
é essencialmente a função inversa.)Mathematica, 32 bytes
Solução recursiva, basicamente a mesma que na resposta de Billywob e outras.
fonte
Brain-Flak , 46 bytes
Zero indexado
Experimente online!
Pilha limpa, 48 bytes
Experimente online!
Explicação
Esta é uma versão modificada da função modulo . Em vez de usar um número constante como divisor, ele aumenta o divisor para cada vez que o divisor é subtraído (uma vez por iteração de loop externo).
Código anotado
fonte
Java 8,
857355 bytesAbordagem recursiva indexada a 0 com a fórmula fornecida no OEIS :
Experimente aqui.
Resposta antiga (
8556 bytes):Usou a outra fórmula indexada em 0 fornecida no OEIS :
Experimente aqui.
fonte
Perl , 30 bytes
29 bytes de código +
-p
sinalizador.Experimente online!
fonte
MATL, 8 bytes
Esta solução usa indexação baseada em 1
Experimente no MATL Online
Explicação
fonte
v
depois]
QBIC , 21 bytes, 1 indexado
Explicação:
Abordagem um pouco mais interessante, mas com 10 bytes a mais:
Este programa calcula continuamente o número total de números neste colchete e todos os anteriores (
1 at loop 1, 3 at loop 2, 6 at loop 3 ...
). Quando esse contador exceder o índice N procurado, retorne X do colchete atual, onde X é N menos o valor anterior do contador.fonte
Ruby, 30 bytes
Indexação baseada em 1
fonte
R, 37 bytes
Recebe entrada
n
e cria a sequência para as primeirasn
seqüências. Isso o torna um pouco ineficiente em entradas mais altas, mas deve estar bem. Em seguida, retorna on
-ésima entrada, indexada em 1.Usa um pequeno truque, iniciando a sequência com
T
, que éTRUE
ou1
por padrão.fonte
C11, 48 bytes
Experimente online!
Também funciona em C ++ e Java.
Uma alternativa para a mesma contagem de bytes:
fonte
brainfuck, 141 bytes
Eu sei que estou muito atrasado para a recompensa, mas eu só queria ver quantos bytes o algoritmo que eu pensava acabaria sendo.
Este programa é indexado em zero.
Experimente online
255
, altere o tamanho da célula (bits) para 16 ou 32 .\5
a entrada de5
.\999
Explicação:
Isso mostra o programa dividido por etapas, mostrando o que acontece para a entrada de
5
.#
são colocados nos locais ideais de despejo de memória para o intérprete.Você provavelmente desejará usar a caixa de seleção Dump Memory em char:
#
se estiver executando esta versão. Isso irá despejar a memória ao bater#
, permitindo que você veja o valor na fita no caso de ser um caractere não imprimível ou o que acontece em qualquer etapa que você desejar. A célula em que o ponteiro está estará em negrito.Experimente online
#
Notas:
>
no início. O número necessário pode variar dependendo do valor de entrada, mas é O (1).fonte
tinylisp (repl), 90 bytes (indexado 0)
Ou, não concorrente (usando um recurso confirmado após o lançamento deste desafio), 80 bytes :
A primeira linha define uma função auxiliar
r
e a segunda linha é uma função sem nome que pegan
e retorna o enésimo termo da sequência. Especifiquei isso como um envio de repl, porque o repl preenche parênteses no final de cada linha, não apenas no final do programa. Com essas ressalvas, aqui está uma versão modificada para funcionar em Experimente online , e aqui uma versão não- executada, executada nas entradas de 0 a 54.Explicação
Vou usar a versão não-competitiva aqui. A única diferença é que a versão oficial precisa implementar a adição como duas subtrações.
fonte
C, 54 bytes
Não é a solução C mais curta, mas tem o mérito de funcionar em tempo constante (sem loops, apenas matemática). Ele usa indexação baseada em zero:
Ungolfed:
Teste com:
fonte
C, 103 bytes
Para um iniciante, tudo bem, eu acho :).
ou a maneira formatada
fonte
n,c,i,j
como globais, é garantido que eles sejam inicializados como 0, o que não é verdade para os locais.n
é a entrada ou o n-ésimo número na sequência,c
é um contadori
ej
são elementos de loop;j
será 1 e 2 e 3, enquantoi
1 e 1,2 e 1,2,3 e assim por diante. @ Qwerp-Derpdc , 21 bytes, indexação baseada em 0
Experimente o programa dc online!
Explicação:
O topo da pilha agora contém o índice k do maior número triangular que é <= n.
Este programa dc pode ser convertido em um script bash de tamanho competitivo:
Utilitários Bash + Unix, 28 bytes, indexação baseada em 0
Experimente o programa bash online!
fonte
C,
8144 bytesmétodo iterativo direto, 0 indexado e com alguma massagem suave;
Experimente online!
fonte