Dependências triangulares

25

Um número triangular é um número que é a soma dos nnúmeros naturais de 1 a n. Por exemplo, 1 + 2 + 3 + 4 = 10também 10é um número triangular.

Dado um número inteiro positivo ( 0 < n <= 10000) como entrada (pode ser considerado um número inteiro ou uma sequência de caracteres), retorne o menor número triangular possível que pode ser adicionado à entrada para criar outro número triangular.

Por exemplo 26, entrada fornecida , adicionando 10resultados em 36, que também é um número triangular. Não há números triangulares menores do que os 10que podem ser adicionados 26para criar outro número triangular, assim 10como o resultado correto neste caso.

0 é um número triangular; portanto, se a entrada for um número triangular, a saída deverá ser 0

Casos de teste

Os casos são dados no formato input -> output (resulting triangular number)

0     -> 0   (0)
4     -> 6   (10)
5     -> 1   (6)
7     -> 3   (10)
8     -> 28  (36)
10    -> 0   (10)
24    -> 21  (45)
25    -> 3   (28)
26    -> 10  (36)
34    -> 21  (55)
10000 -> 153 (10153)

Pontuação

Isso é e o menor número de bytes em cada idioma vence!

Skidsdev
fonte
Não é 26 -> 2?
Okx
@ Ok, cometi o mesmo erro, você precisa encontrar um número triangular para adicionar ao atual e criar outro número triangular.
Martin Ender
2
Relacionado. (duplicado borderline)
Martin Ender

Respostas:

21

Java 8, 58 57 bytes

n->{int i=0,m=0;while(n!=0)n+=n<0?++i:--m;return-~i*i/2;}

Conjunto de testes online

Agradecemos a Dennis pela economia de 1 byte.

Peter Taylor
fonte
6
Agora isso é Java, jogado golfe! :)
Olivier Grégoire
4
@Computronium, a ordem das operações é garantida pela Java Language Specification . Java deliberadamente evita algumas das fraquezas de C.
Peter Taylor
2
return-~i*i/2;salva um byte.
Dennis
1
O @Okx Java é uma passagem por valor para tipos primitivos e passagem por referência para objetos (incluindo matrizes). Se você realmente deseja gerar a mesma variável, deve estar em um contexto de passagem por referência (explicitamente dito no seu link). A única maneira que vejo de passagem por referência que poderia funcionar é passar um argumento em int[]vez de intcomo as. Mas isso significa lidar com matrizes mais tarde. Isso poderia funcionar:, x->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}mas são 63 bytes.
Olivier Grégoire
7

MATL , 13 12 bytes

1 byte removido usando uma ideia (definir interseção) da resposta 05AB1E de Emigna

Q:qYstG-X&X<

Experimente online!

Explicação

Vamos t(n) = 1 + 2 + ··· + ndenotar o n-ésimo número triangular.

O código explora o fato de que, dada na solução, o limite é superior t(n-1). Para ver isso, observe que t(n-1) + né igual t(n)e, portanto, é um número triangular.

Considere a entrada 8como um exemplo.

Q:q   % Input n implicitly. Push [0 1 2 ... n]
      % STACK: [0 1 2 3 4 5 6 7 8]
Ys    % Cumulative sum
      % STACK: [0 1 3 6 10 15 21 28 36]
t     % Duplicate
      % STACK: [0 1 3 6 10 15 21 28 36], [0 1 3 6 10 15 21 28 36]
G-    % Subtract input, element-wise
      % STACK: [0 1 3 6 10 15 21 28 36], [-8 -7 -5 -2  2  7 13 20 28]
X&    % Set intersection
      % STACK: 28
X<    % Minimum of array (in case there are several solutions). Implicit display
      % STACK: 28
Luis Mendo
fonte
Você pode remover a liderança Qdo seu argumento sobre limites?
Giuseppe
@ Giuseppe Não, isso falha na entrada 8. Quando a saída é igual ao limite t(n-1), o código o obtém como t(n)-n. Então t(n)é necessário. Obrigado pela ideia de qualquer maneira!
Luis Mendo
7

Java (OpenJDK 8) , 83 bytes

n->{int m=0,a=n,b;for(;a-->0;)for(b=0;b<=n;)m=2*n+b*~b++==a*~a?a*a+a:m;return m/2;}

Experimente online!

Créditos

Olivier Grégoire
fonte
1
Boa resposta (como sempre ..). Não tinha notado que já havia uma resposta Java quando publiquei a minha . A minha era inicialmente mais curta, mas não parece mais. :)
Kevin Cruijssen
Obrigado! Sim, minha primeira resposta foi realmente redundante. Corrigi-o e tornei-o mais matemático, embora mais ganancioso no processador também. Vou verificar o seu em um segundo!
Olivier Grégoire
Eu ainda não entendo o que está acontecendo aqui. Por que está funcionando? Você está substituindo m toda vez, então qual é o objetivo?
V. Courtois
2
@ V.Courtois A pergunta pede o menor m. Então eu vou de abaixo para 0. "mas você está atribuindo talvez 100 vezes o mesmo valor a*a+apara mno b-loop", sim, eu não precisa fazê-lo 100 vezes, mas eu estou ganhando bytes por não quebrar o b-loop anteriormente.
Olivier Grégoire
Eu vejo @ OlivierGrégoire. Então, isso é anti-eficiente de propósito: D
V. Courtois
5

Mathematica, 46 bytes

Min[Select[(d=Divisors[2#])-2#/d,OddQ]^2-1]/8&
alefalpha
fonte
4

Neim , 12 9 bytes

tS𝕊Λt𝕚)0𝕔

Isso leva muito tempo para calcular (mas funciona com tempo e memória infinitos); portanto, no link eu apenas giro os primeiros 143 números triangulares - usando £𝕖, o suficiente para lidar com uma entrada de 10.000, mas não o suficiente para atingir o tempo limite.

Aviso: isso pode não funcionar em versões futuras. Em caso afirmativo, substitua £ por 143

Explicação:

t                 Infinite list of triangular numbers
 [ 𝕖]             Select the first  v  numbers
 [£ ]                              143
     S𝕊           Subtract the input from each element
       Λ  )       Only keep elements that are
        t𝕚          triangular
           0𝕔     Get the value closest to 0 - prioritising the higher number if tie

Tente!

Okx
fonte
Como os primeiros 143 números de triângulos são suficientes para qualquer entrada entre 0 e 10000? Com a entrada 9998, o resultado esperado é 3118753, que está muito acima do número do triângulo 143 (que é `10296).
Olivier Grégoire
@ OlivierGrégoire porqueThis takes too long to compute (but works given infinite time and memory)
Stephen
Obrigado @StepHen, mas não foi isso que eu disse. O que sugeri é que a frase "os primeiros 143 números triangulares [são] suficientes para lidar com uma entrada de 10.000" está errada. Eu não fiz as contas, mas eu acredito que você deve precisar de cerca de 10000 (mais ou menos) números triângulo para lidar com os casos até 10000.
Olivier Grégoire
@ OlivierGrégoire Afirmei que é suficiente lidar com uma entrada de 10.000, mas nenhum número menor que ele. Sinta-se à vontade para mudar £para um número mais alto, como 200.
Okx
@ Ok Ok, eu não entendi assim quando li pela primeira vez, obrigado por dedicar um tempo para explicar :)
Olivier Grégoire
4

PHP , 45 bytes

for(;!$$t;$t+=++$i)${$argn+$t}=~+$t;echo~$$t;

Experimente online!

É a variante mais curta de for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];

Expandido

for(;!$$t;  # stop if a triangular number exists where input plus triangular number is a triangular number
$t+=++$i) # make the next triangular number
  ${$argn+$t}=~+$t; # build variable $4,$5,$7,$10,... for input 4 
echo~$$t; # Output result 

PHP , 53 bytes

for(;$d=$t<=>$n+$argn;)~$d?$n+=++$k:$t+=++$i;echo+$n;

Experimente online!

Use o novo operador de nave espacial no PHP 7

Expandido

for(;$d=$t<=>$n+$argn;) # stop if triangular number is equal to input plus triangular number 
  ~$d
    ?$n+=++$k  # raise additional triangular number
    :$t+=++$i; # raise triangular number sum
echo+$n; # Output and cast variable to integer in case of zero

PHP , 55 bytes

for(;fmod(sqrt(8*($t+$argn)+1),2)!=1;)$t+=++$i;echo+$t;

Experimente online!

Jörg Hülsermann
fonte
4

Java 8, 110 102 100 93 92 bytes

n->{int r=0;for(;t(r)<-t(n+r);r++);return r;}int t(int n){for(int j=0;n>0;n-=++j);return n;}

-2 bytes graças a @PeterTaylor .
-7 bytes graças a @JollyJoker .
-1 byte graças a @ceilingcat .

Explicação:

Experimente online.

n->{                  // Method with integer as parameter and return-type
  int r=0;            //  Result-integer (starting at 0)
  for(;t(r)<-t(n+r);  //  Loop as long as neither `r` nor `n+r` is a triangular number
    r++);             //   And increase `r` by 1 after every iteration
  return r;}          //  Return the result of the loop

int t(int n){         // Separate method with integer as parameter and return-type
                      // This method will return 0 if the input is a triangular number
  for(int i=0;n>0;)   //  Loop as long as the input `n` is larger than 0
    n-=++j;           //   Decrease `n` by `j` every iteration, after we've raised `j` by 1
  return n;}          //  Return `n`, which is now either 0 or below 0
Kevin Cruijssen
fonte
1
Mais fácil de ler das soluções Java :)
jollyjoker
@JollyJoker Talvez seja por isso que seja o mais longo. ;) Ou é por causa da minha explicação adicionada?
Kevin Cruijssen
Nah, eu estava pensando sobre o código. Eu provavelmente passei 15 minutos descobrindo como a solução de Peter Taylor funciona. O seu é claro, mesmo sem os comentários.
JollyJoker #
3

Braquilog , 17 15 bytes

⟦{a₀+}ᶠ⊇Ċ-ṅ?∧Ċh

Experimente online!

Explicação

⟦                  [0, …, Input]
 {   }ᶠ            Find all…
  a₀+                …Sums of prefixes (i.e. triangular numbers)
       ⊇Ċ          Take an ordered subset of two elements
         -ṅ?       Subtracting those elements results in -(Input)
            ∧Ċh    Output is the first element of that subset
Fatalizar
fonte
3

Python 2 , 59 bytes

lambda n:min((r-2*n/r)**2/8for r in range(1,2*n,2)if n%r<1)

Experimente online!

Isso usa a seguinte caracterização dos números triangulares tque podem ser adicionados npara obter um número triangular:

8*t+1 = (r-2*s)^2para pares divisores (r,s)com r*s==ne rímpar.

O código leva o mínimo de todos esses números triangulares.

xnor
fonte
3

Geléia , 8 bytes

0r+\ðf_Ḣ

Experimente online!

Como funciona

0r+\ðf_Ḣ  Main link. Argument: n

0r        Build [0, ..., n].
  +\      Take the cumulative sum, generating A := [T(0), ..., T(n)].
    ð     Begin a dyadic chain with left argument A and right argument n.
      _   Compute A - n, i.e., subtract n from each number in A.
     f    Filter; keep only numbers of A that appear in A - n.
       Ḣ  Head; take the first result.
Dennis
fonte
3

Japt , 24 23 16 15 bytes

ò å+
m!nNg)æ!øU

Teste-o

1 byte economizado graças ao ETH


Explicação

    :Implicit input of integer U.
ò   :Create an array of integers from 0 to U, inclusive.
å+  :Cumulatively reduce by summing. Result is implicitly assigned to variable V.
m   :Map over U.
!n  :From the current element subtract...
Ng  :  The first element in the array of inputs (the original value of U).
æ   :Get the first element that returns true when...
!øU :  Checking if U contains it.
    :Implicit output of resulting integer.
Shaggy
fonte
Eu acho que você pode salvar um byte com æ!øV. Fora isso, parece ótimo :-)
ETHproductions
2

Mathematica, 62 bytes

(s=Min@Abs[m/.Solve[2#==(n-m)(n+m+1),{n,m},Integers]])(s+1)/2&
J42161217
fonte
Não conheço o Mathematica, mas seria Solve[2*#==m(m+1)-n(n+1)mais curto (se funcionar)?
Kritixi Lithos
sim, acabei de postar minha resposta e tentando jogar agora
J42161217
2

Python 2 , 78 71 70 bytes

Sete bytes salvos, thanx para ovs e theespinosa

Mais um byte economizado devido à observação de neil , x+9é suficiente e verificado para todos os números naturais 0 <= n <= 10000. Também foi verificado, em x+1vez de x+9, também funciona.

x=input()
I={n*-~n/2for n in range(x+1)}
print min(I&{i-x for i in I})

Experimente online!

mdahmoune
fonte
2
Você pode usar em n*-~n/2vez den*(n+1)/2
ovs 29/06
2
O intervalo (x + 9) funcionaria?
Neil
2
Você pode usar {n*(n+1)/2for n in range(999)}em vez de explícita sete também usar {}em vez de setna terceira linha
TheEspinosa
2

JavaScript (ES6), 43 42 bytes

f=(n,a=s=0)=>n?f(n+=n>0?--s:++a,a):a*++a/2
<input type=number min=0 value=0 oninput=o.textContent=f(+this.value)><pre id=o>0

Editar: salvou 1 byte graças a @PeterTaylor.

Neil
fonte
Definir uma variável global é um abuso hediondo de um parâmetro padrão. +1. Mas, no FWIW, você pode salvar um byte adicional substituindo -++spor --s, como fiz na minha versão Java independentemente derivada, mas bastante semelhante. (Adendo: você também precisa alterar o teste para n>0).
Peter Taylor
@ PeterTaylor Huh, então o n>scheque era um arenque vermelho o tempo todo!
Neil
Funciona não para 8192
Jörg Hülsermann 29/06
@ JörgHülsermann Se você está se referindo ao snippet, o tamanho da pilha do seu navegador pode não ser grande o suficiente ou pode ser necessário um navegador com otimização experimental da chamada de cauda. Como alternativa, se você estiver usando o NodeJS para teste, use node --stack_size=para aumentar o tamanho da pilha.
Neil
2

Python 3 , 60 44 bytes

f=lambda n,k=1:(8*n+1)**.5%1and f(n+k,k+1)+k

Obrigado a @xnor por uma sugestão que salvou 16 bytes!

Experimente online!

fundo

Seja n um número inteiro não negativo. Se n é o k- ésimo número triangular, temos

condição

o que significa que haverá uma solução natural se e somente se 1 + 8n for um quadrado ímpar e perfeito. Claramente, verificando a paridade de 1 + 8n não é necessária.

Como funciona

A função recursiva n aceita um único número inteiro não negativo como argumento. Quando chamado com um único argumento, k assume o padrão 1 .

Primeiro, (8*n+1)**.5%1testa se n é um número triangular: se (e somente se) for, (8*n+1)**.5produzirá um número inteiro; portanto, o resíduo da divisão por 1 produzirá 0 .

Se o módulo for 0 , a andcondição falhará, fazendo com que f retorne 0 . Se isso acontecer na chamada inicial para f , observe que esta é a saída correta, pois n já é triangular.

Se o módulo for positivo, a andcondição será mantida e f(n+k,k+1)+kexecutada. Isso chama f novamente, incrementando n por k e k por 1 e , em seguida, adiciona k ao resultado.

Quando f (n 0 , k 0 ) finalmente retorna 0 , voltamos à recursão. O primeiro argumento na primeira chamada foi n , o segundo n + 1 , o terceiro n + 1 + 2 , até que finalmente n 0 = n + 1 +… k 0 -1 . Observe que n 0 - n é um número triangular.

Da mesma forma, todos esses números inteiros serão adicionados ao valor de retorno mais interno ( 0 ); portanto, o resultado da chamada inicial f (n) é n 0 - n , conforme desejado.

Dennis
fonte
Se você aumentar a nrecorrência também, poderá escrever em nvez de (n+k).
Xnor
Uau, isso é muito melhor do que eu estava tentando.
Xnor
2

C # (.NET Core) , 291 281 bytes

class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}

Experimente online! Programa que recebe uma string como entrada e sai através do código de saída.

Guardado 10 bytes graças a Kevin Cruijssen

Kamil Drakari
fonte
1
Olá, seja bem-vindo ao PPCG! Você não precisa de um programa completo, a menos que o desafio indique o contrário. O padrão é programa / função, portanto, um lambda também é permitido em C #. Mas se você quiser usar o programa, você pode golfe algumas coisas em seu código atual: class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}( 281 bytes )
Kevin Cruijssen
@KevinCruijssen Obrigado pelo conselho! usar for(;;)para criar um loop infinito é uma boa solução, e vou pensar com mais cuidado se o uso de var é realmente mais eficiente do que usar um tipo explícito, mas combinando as declarações, e acho que seja mais diligente na remoção de colchetes desnecessários. Quanto ao programa vs. função, comecei com um lambda, mas não consegui executá-lo no TIO. Eu sei que um link TIO não é realmente necessário, mas é algo que eu gosto de ver nas respostas de outras pessoas, então eu queria pelo menos algo semelhante nas minhas.
Kamil Drakari
Eu também não sou muito bom em C # lambdas tbh, eu normalmente codegolf em Java. Mas acho que isso deve estar correto . ( 252 bytes ). Além disso, caso você ainda não tenha visto: Dicas para jogar golfe em código em C # e Dicas para jogar golfe em <todos os idiomas> podem ser interessantes para ler. Mais uma vez bem-vindo e +1 de mim. Ótima primeira resposta. Aproveite sua estadia. :)
Kevin Cruijssen
2

JavaScript (ES7), 46 44 bytes

f=(n,x=r=0)=>(8*(n+x)+1)**.5%1?f(n,x+=++r):x

Tente

o.innerText=(
f=(n,x=r=0)=>(8*(n+x)+1)**.5%1?f(n,x+=++r):x
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

Shaggy
fonte
1
Funcionaria r=x=0?
Kritixi Lithos
Infelizmente não, @KritixiLithos.
Shaggy
1

05AB1E , 8 bytes

ÝηODI-Ãн

Experimente online! ou como um conjunto de testes

Explicação

Ý          # range [0 ... input]
 η         # prefixes
  O        # sum each
   D       # duplicate
    I-     # subtract input from each
      Ã    # keep only the elements in the first list that also exist in the second list
       н   # get the first (smallest)
Emigna
fonte
1

Dyalog APL, 19 bytes

6 bytes salvos graças a @KritixiLithos

{⊃o/⍨o∊⍨⍵+o←0,+\⍳⍵}

Experimente online!

Quão?

o←0,+\⍳⍵- atribuir oos primeiros números triangulares

o/⍨- filtrar opor

o∊⍨⍵+o- números triangulares que somados produzem triangulares

- e pegue a primeira

Uriel
fonte
+\⍳⍵ deve funcionar em vez do que você está usando para gerar os números triangulares.
Kritixi Lithos
Eu acho que funciona em vez de⌊/
Kritixi Lithos
1

Pari / GP , 54 bytes

n->vecmin([y^2-1|y<-[2*n/d-d|d<-divisors(2*n)],y%2])/8

Experimente online!

alefhalpha
fonte
1

Adicionar ++ , 68 bytes

L,RBFEREsECAAx$pBcB_B]VARBFEREsB]GEi$pGBcB*A8*1+.5^1%!!@A!@*b]EZBF#@

Experimente online! , ou veja a suíte de testes !

Mesmo Java está me batendo. Eu realmente preciso adicionar alguns comandos de conjunto para adicionar ++

Como funciona

L,    - Create a lambda function
      - Example argument:  8
  R   - Range;     STACK = [[1 2 3 4 5 6 7 8]]
  BF  - Flatten;   STACK = [1 2 3 4 5 6 7 8]
  ER  - Range;     STACK = [[1] [1 2] ... [1 2 3 4 5 6 7 8]
  Es  - Sum;       STACK = [1 3 6 10 15 21 28 36]
  EC  - Collect;   STACK = [[1 3 6 10 15 21 28 36]]
  A   - Argument;  STACK = [[1 3 6 10 15 21 28 36] 8]
  A   - Argument;  STACK = [[1 3 6 10 15 21 28 36] 8 8]
  x   - Repeat;    STACK = [[1 3 6 10 15 21 28 36] 8 [8 8 8 8 8 8 8 8]]
  $p  - Remove;    STACK = [[1 3 6 10 15 21 28 36] [8 8 8 8 8 8 8 8]]
  Bc  - Zip;       STACK = [[1 8] [3 8] [6 8] [10 8] [15 8] [21 8] [28 8] [36 8]]
  B_  - Deltas;    STACK = [-7 -5 -2 2 7 13 20 28]
  B]  - Wrap;      STACK = [[-7 -5 -2 2 7 13 20 28]]
  V   - Save;      STACK = []
  A   - Argument;  STACK = [8]
  R   - Range;     STACK = [[1 2 3 4 5 6 7 8]]
  BF  - Flatten;   STACK = [1 2 3 4 5 6 7 8]
  ER  - Range;     STACK = [[1] [1 2] ... [1 2 3 4 5 6 7 8]]
  Es  - Sum;       STACK = [1 3 6 10 15 21 28 36]
  B]  - Wrap;      STACK = [[1 3 6 10 15 21 28 36]]
  G   - Retrieve;  STACK = [[1 3 6 10 15 21 28 36] [-7 -5 -2 2 7 13 20 28]]
  Ei  - Contains;  STACK = [[1 3 6 10 15 21 28 36] [0 0 0 0 0 0 0 1]]
  $p  - Remove;    STACK = [[0 0 0 0 0 0 0 1]]
  G   - Retrieve;  STACK = [[0 0 0 0 0 0 0 1] [-7 -5 -2 2 7 13 20 28]]
  Bc  - Zip;       STACK = [[0 -7] [0 -5] [0 -2] [0 2] [0 7] [0 13] [0 20] [1 28]]
  B*  - Products;  STACK = [0 0 0 0 0 0 0 28]
  A   - Argument;  STACK = [0 0 0 0 0 0 0 28 8]
  8*  - Times 8;   STACK = [0 0 0 0 0 0 0 28 64]
  1+  - Increment; STACK = [0 0 0 0 0 0 0 28 65]
  .5^ - Root;      STACK = [0 0 0 0 0 0 0 28 8.1]
  1%  - Frac part; STACK = [0 0 0 0 0 0 0 28 0.1]
  !!  - To bool;   STACK = [0 0 0 0 0 0 0 28 1]
  @   - Reverse;   STACK = [1 28 0 0 0 0 0 0 0]
  A   - Argument;  STACK = [1 28 0 0 0 0 0 0 0 8] 
  !   - Not;       STACK = [1 28 0 0 0 0 0 0 0 0]
  @   - Reverse;   STACK = [0 0 0 0 0 0 0 0 28 1]
  *   - Multiply;  STACK = [0 0 0 0 0 0 0 0 28]
  b]  - Wrap;      STACK = [0 0 0 0 0 0 0 0 [28]]
  EZ  - Unzero;    STACK = [[28]]
  BF  - Flatten;   STACK = [28]
  #   - Sort;      STACK = [28]
  @   - Reverse;   STACK = [28]
caird coinheringaahing
fonte
1

R , 46 44 43 41 bytes

function(x,y=cumsum(0:x))y[(x+y)%in%y][1]

Experimente online!

Uma função anônima com um argumento obrigatório x; calcula os primeiros x+1números triangulares como um argumento opcional para jogar fora algumas chaves. eu useichoose antes de ver o Luis Mendo resposta de oitava de .

Raspei alguns bytes da resposta de Luis Mendo, mas esqueci de usar a mesma idéia na minha resposta.

Giuseppe
fonte
0

Python 2 , 83 81 bytes

  • @Felipe Nardi Batista salvou 2 bytes.
lambda n:min(x for x in i(n)if n+x in i(n))
i=lambda n:[i*-~i/2for i in range(n)]

Experimente online!

officialaimm
fonte
0

Clojure, 74 bytes

#(nth(for[t[(reductions +(range))]i t :when((set(take 1e5 t))(+ i %))]i)0)
#(nth(for[R[reductions]i(R + %(range)):when((set(R - i(range 1e5)))0)]i)0)

Escolha o seu favorito :) Os loops podem ser mais curtos ...

NikoNyrh
fonte
0

Python 2 , 82 bytes

f=lambda n,R=[1]:n-sum(R)and f(n,[R+[R[-1]+1],R[1:]][sum(R)>n])or sum(range(R[0]))

Experimente online

Isso foi criado modificando esta resposta da pergunta relacionada.

mbomb007
fonte
funciona não para 8192
Jörg Hülsermann 29/06
Também não funciona para a questão relacionada, devido à profundidade da recursão. Não sei ao certo qual é o consenso.
mbomb007
Algumas outras respostas têm o mesmo problema. I dão apenas a informação
Jörg Hülsermann