fundo
Considere uma sequência definida da seguinte maneira:
- O primeiro elemento é 0;
- O segundo elemento é 4;
- A partir do terceiro elemento, seu valor pode ser calculado por:
- Tomando o conjunto de números inteiros de 0 até o elemento anterior da sequência (inclusivo ou exclusivo, não importa);
- Remoção de números inteiros que já apareceram anteriormente na sequência do conjunto;
- Adicionando os demais elementos do conjunto; esse é o valor que você deseja.
Curiosamente, essa sequência ainda não parece estar no OEIS .
A tarefa
Escrever um programa ou função que leva um número inteiro n como entrada, e gera o n ésimo elemento da sequência.
Casos de teste
Os primeiros elementos da sequência são:
- 0 0
- 4
- 6 (1 + 2 + 3)
- 11 (1 + 2 + 3 + 5)
- 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
- 969 (1 + 2 + 3 + 5 + 7… 10 + 12… 44)
- 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)
Esclarecimentos
- Em teoria, seu programa deve ser capaz de lidar com n arbitrário se for executado em uma variante de sua linguagem que possua números inteiros ilimitados e acesso a uma quantidade ilimitada de memória. (É improvável que os idiomas sem bignums possam ir muito além do 468930, mas isso não é desculpa para codificar as respostas.)
- Você pode escolher a indexação com base em 0 ou em 1 para a sequência (por exemplo, depende de você se n = 1 retorna o primeiro elemento, n = 2 o segundo elemento e assim por diante; ou se n = 0 retorna o primeiro elemento , n = 1 o segundo elemento e assim por diante).
- Não há requisitos no algoritmo que você usa, nem em sua eficiência; você pode implementar a definição da sequência diretamente (mesmo que seja realmente ineficiente) e também pode implementar um algoritmo diferente que leva aos mesmos resultados.
Condição de vitória
Isso é código-golfe , e o programa correto mais curto, medido em bytes, vence.
Respostas:
Geléia ,
13129 bytesUsa indexação baseada em 0.
Experimente online!
Como funciona
fonte
Python,
6660 bytesObrigado a @Dennis por eliminar 6 bytes!
Não é o código mais golfista de todos os tempos, mas usa uma fórmula que eu criei:
Onde
x
está do lado direitof(n - 1)
ey
estáf(n - 2)
.Explicação:
A soma dos números inteiros contínuos de
a
atéb
(inclusive) pode ser descrita por esta fórmula:Onde
amount
(quantidade de números) é descrito da seguinte maneira:E
average
(a média de todos os números) é descrita assim:Portanto, a fórmula completa é agora:
A nossa forma de implementar esta fórmula na fórmula final é substituir
a
paraf(n - 1)
,b
paraf(n - 2)
, que, basicamente, calcula a soma de todos os novos termos, e adicionar outrof(n - 1)
(que é agoraa
), o que é a soma de todos os termos anteriores.Combinando isso, obtemos:
Substitua
a
comx
eb
comy
, e voilá, você tem que fórmula acima.fonte
Python 2 ,
585450 bytesExperimente online!
fonte
Mathematica,
4948 bytesUsa a codificação CP-1252. Define a função
PlusMinus (±)
. 1 indexado.Explicação
fonte
Oásis , 11 bytes
Código:
Explicação:
Para visualizar a relação de f n , vamos dar o exemplo f 5 . Para calcular f 5 , vamos dar uma olhada na seguinte soma:
1 + 2 + 3 + 5 + 7 + 8 + 9 + 10
A parte em negrito é igual a f 4 . A parte 7 + 8 + 9 + 10 é o intervalo [f n-2 + 1, f n-1 - 1] . Isso cria a fórmula f n-1 + Σ [f n-2 + 1 ... f n- 1-1 ] ( link Wolfram ):
f n = 0,5 × (f n-1 2 - f n-2 2 + f n-1 - f n-2 )
Que pode ser reescrito para:
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1))
Qual é a fórmula que usaremos no código:
Explicação do código
A
640
parte nos fornece os casos básicos:O código que será executado (que define a (n) ):
Experimente online!
fonte
Julia,
393332 bytesBaseado em 0.
Graças a @Dennis, economizou 6 bytes.
Graças a @GlenO, salvou um byte.
Experimente online!
Resposta anterior 1- baseada:
Experimente online!
Resposta ungolfed anterior, baseada em 1:
Experimente online!
fonte
n<3?5n-n^2:
vez den<4?2(n>1)n:
- observe que ele alterna para o uso de indexação baseada em 0.JavaScript (ES6), 47 bytes
Usa a relação de recorrência que
f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))
para n> 2.fonte
PowerShell ,
84898887 bytesExperimente online!
Explicação
Indexação baseada em 0. Só funciona
n = 6
(na minha máquina Windows, ele trava com um estouro de pilhan = 7
).Usando o mesmo método da resposta de JungHwan Min (soma do intervalo menos soma dos termos anteriores).
A soma de um intervalo / matriz no PowerShell é longa; portanto, estou usando um truque para associar uma matriz a
+
para criar uma expressão longa (como1+2+3+4...etc
) e depois enviá-la atravésiex
(Invoke-Expression
).Como eu preciso fazer isso duas vezes, em vez de usar
-join
, estou configurando a variável especial$OFS
, que significa separador de campos de saída. Quando você especifica uma matriz, esse é o caractere usado para juntar os elementos; padrão para um espaço. Assim, definindo-o como+
(uma vez), eu posso substituir algo como$a-join'+'|iex
com"$a"|iex
.Um
for
loop simples continua até que a contagem de sequências seja menor ou igual ao número inteiro de entrada e, em seguida, retorno o$n
elemento th.fonte
;
necessário após ofor
loop. Nunca percebi isso antes.MATL ,
1716 bytes1
indexação baseada em dados é usada. O código é muito ineficiente. Poisn = 6
já excede o limite de memória do compilador online.Experimente online!
Como funciona
Para 20 bytes , a versão a seguir evita a limitação de memória. Mas ainda existe a limitação do tipo de dados (o
double
tipo só pode garantir que os números inteiros sejam representados com precisão até2^53
), portanto, os resultados são válidos atén = 8
apenas.Experimente online também!
fonte
Haskell , 42 bytes
Experimente online!
Este implementa diretamente a recorrência que para
n>2
,f(n)
igualaf(n-1)
mais a soma do intervalo aberto a partirf(n-2)
def(n-1)
que novamente é igual à soma do intervalo semi-aberto a partirf(n-2)
def(n-1)
inclusiva.fonte
Haskell, 31 bytes
Exemplo de uso:
((0:4#6)!!) 6
->468930
. Experimente online! .Recursão simples, que monitora o elemento máximo
m
até o momento e o próximo valors
.fonte
JavaScript,
123119 bytesExperimente online! Esta solução é baseada em 1
f(1) => 0
.fonte
Perl 6 ,
52 49 4435 bytesTente
Tente
Tente
Tente
Expandido:
fonte
PowerShell ,
7773 bytesExperimente online!
Implementa o algoritmo conforme definido e é indexado em 0. Entrada de
6
é demais para o TIO manipular.Define
$a
para ser uma matriz[0,4]
. Loops de1
até entrada$n
. No loop, pegamos o intervalo de números do0
maior número que temos$a[-1]
e usamos umaWhere-Object
cláusula|?{...}
para extrair apenas os números que ainda não estão presentes. Essa matriz de números é-join
editada junto com+
s e depois é alimentada comiex
(abreviação deInvoke-Expression
e semelhante aeval
). Esse valor é então concatenado por matriz no final de$a
. Finalmente, saímos do loop e pegamos o$n
número th em nossa matriz. Esse número é deixado no pipeline e a saída está implícita.fonte
Python 2 , 85 bytes
Experimente online!
fonte
Lote, 108 bytes
Porta da minha resposta JavaScript.
fonte
dc , 47 bytes
Funciona com números inteiros do tamanho que você deseja, até a capacidade de memória do computador.
Experimente online!
Indexação baseada em 0, entrada em stdin, saída em stdout. (Também há saída no stderr, que deve ser ignorada.)
Amostras de execuções:
Isso usa o mesmo algoritmo que a seguinte solução no bash, que é (um pouco) mais legível:
Festa pura, 60 bytes
Mas o programa bash funciona apenas para entradas de até 7, pois atinge o número inteiro além disso.
fonte
Pitão - 15 bytes
Conjunto de Teste .
fonte
C # - 74 bytes
Ungolfed:
Provavelmente existe uma maneira de converter isso em um lambda para economizar ainda mais, ou algo usando a função .Aggregate. Embora atualmente não possua importações, talvez isso seja igual?
fonte
> <> , 43 + 3 = 46 bytes
Utiliza a fórmula apresentada nas respostas de Adnan e Qwerp-Derp .
Espera que a entrada esteja presente na pilha, portanto, +3 bytes para o
-v
sinalizador.Experimente online!
fonte