Um número triangular é um número que é a soma dos n
números naturais de 1 a n
. Por exemplo, 1 + 2 + 3 + 4 = 10
també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 10
resultados em 36
, que também é um número triangular. Não há números triangulares menores do que os 10
que podem ser adicionados 26
para criar outro número triangular, assim 10
como 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 é código-golfe, e o menor número de bytes em cada idioma vence!
26 -> 2
?Respostas:
Java 8,
5857 bytesConjunto de testes online
Agradecemos a Dennis pela economia de 1 byte.
fonte
return-~i*i/2;
salva um byte.int[]
vez deint
como 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.MATL ,
1312 bytes1 byte removido usando uma ideia (definir interseção) da resposta 05AB1E de Emigna
Experimente online!
Explicação
Vamos
t(n) = 1 + 2 + ··· + n
denotar on
-ésimo número triangular.O código explora o fato de que, dada
n
a solução, o limite é superiort(n-1)
. Para ver isso, observe quet(n-1) + n
é igualt(n)
e, portanto, é um número triangular.Considere a entrada
8
como um exemplo.fonte
Q
do seu argumento sobre limites?8
. Quando a saída é igual ao limitet(n-1)
, o código o obtém comot(n)-n
. Entãot(n)
é necessário. Obrigado pela ideia de qualquer maneira!Java (OpenJDK 8) , 83 bytes
Experimente online!
Créditos
fonte
m
. Então eu vou dea
baixo para0
. "mas você está atribuindo talvez 100 vezes o mesmo valora*a+a
param
nob
-loop", sim, eu não precisa fazê-lo 100 vezes, mas eu estou ganhando bytes por não quebrar ob
-loop anteriormente.Mathematica, 46 bytes
fonte
Neim ,
129 bytesIsso 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:
Tente!
fonte
9998
, o resultado esperado é3118753
, que está muito acima do número do triângulo 143 (que é `10296).This takes too long to compute (but works given infinite time and memory)
£
para um número mais alto, como 200.PHP , 45 bytes
Experimente online!
É a variante mais curta de
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
Expandido
PHP , 53 bytes
Experimente online!
Use o novo operador de nave espacial no PHP 7
Expandido
PHP , 55 bytes
Experimente online!
fonte
Java 8,
1101021009392 bytes-2 bytes graças a @PeterTaylor .
-7 bytes graças a @JollyJoker .
-1 byte graças a @ceilingcat .
Explicação:
Experimente online.
fonte
Braquilog ,
1715 bytesExperimente online!
Explicação
fonte
Python 2 , 59 bytes
Experimente online!
Isso usa a seguinte caracterização dos números triangulares
t
que podem ser adicionadosn
para obter um número triangular:O código leva o mínimo de todos esses números triangulares.
fonte
Geléia , 8 bytes
Experimente online!
Como funciona
fonte
Japt ,
24231615 bytesTeste-o
1 byte economizado graças ao ETH
Explicação
fonte
æ!øV
. Fora isso, parece ótimo :-)Oitava ,
3836 bytes2 bytes de desconto graças a @ Giuseppe!
Função anônima que usa quase a mesma abordagem que minha resposta MATL .
Experimente online!
fonte
05AB1E , 12 bytes
Usa a codificação 05AB1E . Experimente online!
fonte
Mathematica, 62 bytes
fonte
Solve[2*#==m(m+1)-n(n+1)
mais curto (se funcionar)?Python 2 ,
787170 bytesSete 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 naturais0 <= n <= 10000
. Também foi verificado, emx+1
vez dex+9
, também funciona.Experimente online!
fonte
n*-~n/2
vez den*(n+1)/2
{n*(n+1)/2for n in range(999)}
em vez de explícitaset
e também usar{}
em vez deset
na terceira linhaJavaScript (ES6),
4342 bytesEditar: salvou 1 byte graças a @PeterTaylor.
fonte
-++s
por--s
, como fiz na minha versão Java independentemente derivada, mas bastante semelhante. (Adendo: você também precisa alterar o teste paran>0
).n>s
cheque era um arenque vermelho o tempo todo!node --stack_size=
para aumentar o tamanho da pilha.Python 3 ,
6044 bytesObrigado 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
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%1
testa se n é um número triangular: se (e somente se) for,(8*n+1)**.5
produzirá um número inteiro; portanto, o resíduo da divisão por 1 produzirá 0 .Se o módulo for 0 , a
and
condiçã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
and
condição será mantida ef(n+k,k+1)+k
executada. 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.
fonte
n
recorrência também, poderá escrever emn
vez de(n+k)
.C # (.NET Core) ,
291281 bytesExperimente 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
fonte
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 )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.JavaScript (ES7),
4644 bytesTente
fonte
r=x=0
?05AB1E , 8 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
Dyalog APL, 19 bytes
6 bytes salvos graças a @KritixiLithos
Experimente online!
Quão?
o←0,+\⍳⍵
- atribuiro
os primeiros⍵
números triangulareso/⍨
- filtraro
poro∊⍨⍵+o
- números triangulares que somados⍵
produzem triangulares⊃
- e pegue a primeirafonte
+\⍳⍵
deve funcionar em vez do que você está usando para gerar os números triangulares.⊃
funciona em vez de⌊/
Pari / GP , 54 bytes
Experimente online!
fonte
Haskell , 56 bytes
Experimente online!
fonte
Adicionar ++ , 68 bytes
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
fonte
R ,
46444341 bytesExperimente online!
Uma função anônima com um argumento obrigatório
x
; calcula os primeirosx+1
nú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.
fonte
Gelatina , 18 bytes
Experimente online!
fonte
Python 2 ,
8381 bytesExperimente online!
fonte
APL (Dyalog Classic) ,
1614 bytesExperimente online!
fonte
Clojure, 74 bytes
Escolha o seu favorito :) Os loops podem ser mais curtos ...
fonte
Python 2 , 82 bytes
Experimente online
Isso foi criado modificando esta resposta da pergunta relacionada.
fonte