Un nombre triangulaire est un nombre qui est la somme des n
nombres naturels de 1 à n
. Par exemple, 1 + 2 + 3 + 4 = 10
il en 10
va de même pour un nombre triangulaire.
Étant donné un entier positif ( 0 < n <= 10000
) en entrée (peut être pris comme un entier ou comme une chaîne), retournez le plus petit nombre triangulaire possible qui peut être ajouté à l'entrée pour créer un autre nombre triangulaire.
Par exemple, pour une entrée donnée 26
, l'ajout de 10
résultats dans 36
, qui est également un nombre triangulaire. Il n'y a pas de nombres triangulaires plus petits que ceux 10
qui peuvent être ajoutés pour 26
créer un autre nombre triangulaire, 10
le résultat est donc correct dans ce cas.
0
est un nombre triangulaire, donc si l'entrée est elle-même un nombre triangulaire, la sortie doit être 0
Cas de test
Les cas sont donnés dans le format 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)
Notation
C'est du golf de code donc le moins d'octets dans chaque langue gagne!
26 -> 2
?Réponses:
Java 8,
5857 octetsSuite de tests en ligne
Merci à Dennis pour une économie d'un octet.
la source
return-~i*i/2;
enregistre un octet.int[]
au lieu d'unint
argument as. Mais cela signifie traiter des tableaux plus tard. Cela pourrait fonctionner:,x->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}
mais c'est 63 octets.MATL ,
1312 octets1 octet supprimé à l'aide d'une idée (intersection définie) de la réponse 05AB1E d'Emigna
Essayez-le en ligne!
Explication
Soit
t(n) = 1 + 2 + ··· + n
len
-ième nombre triangulaire.Le code exploite le fait que, étant donné
n
, la solution est limitée part(n-1)
. Pour voir cela, observez celat(n-1) + n
égalt(n)
et c'est donc un nombre triangulaire.Considérez la saisie
8
comme exemple.la source
Q
début de votre argument sur la délimitation?8
. Lorsque la sortie est égale à la limitet(n-1)
, le code l'obtient commet(n)-n
. C'est donct(n)
nécessaire. Merci pour l'idée quand même!Java (OpenJDK 8) , 83 octets
Essayez-le en ligne!
Crédits
la source
m
. Je vais donc dea
bas en haut0
. « mais vous attribuer la même valeur peut - être 100 foisa*a+a
àm
lab
-loop », eh oui, je ne ai pas besoin de le faire 100 fois, mais je gagne octets en ne brisant leb
-loop plus tôt.Mathematica, 46 octets
la source
Neim ,
129 octetsCela prend trop de temps à calculer (mais fonctionne avec un temps et une mémoire infinis), donc dans le lien, je ne génère que les 143 premiers nombres triangulaires - en utilisant
£𝕖
, ce qui est suffisant pour gérer une entrée de 10000, mais pas assez pour expirer.Attention: cela pourrait ne pas fonctionner dans les futures versions. Si oui, remplacez £ par 143
Explication:
Essayez!
la source
9998
, le résultat attendu est3118753
, ce qui est bien au-dessus du 143ème numéro de triangle (qui est `10296).This takes too long to compute (but works given infinite time and memory)
£
à un nombre plus élevé, tel que 200.PHP , 45 octets
Essayez-le en ligne!
Est la variante la plus courte de
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
Étendu
PHP , 53 octets
Essayez-le en ligne!
Utilisez le nouvel opérateur de vaisseau spatial en PHP 7
Étendu
PHP , 55 octets
Essayez-le en ligne!
la source
Java 8,
1101021009392 octets-2 octets grâce à @PeterTaylor .
-7 octets grâce à @JollyJoker .
-1 octet grâce à @ceilingcat .
Explication:
Essayez-le en ligne.
la source
Brachylog ,
1715 octetsEssayez-le en ligne!
Explication
la source
Python 2 , 59 octets
Essayez-le en ligne!
Cela utilise la caractérisation suivante des nombres triangulaires qui
t
peuvent être ajoutésn
pour obtenir un nombre triangulaire:Le code prend le minimum de tous ces nombres triangulaires.
la source
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
la source
Japt ,
24231615 octetsEssaye-le
1 octet économisé grâce à ETH
Explication
la source
æ!øV
. A part ça, ça a l'air super :-)Octave ,
3836 octets2 octets de réduction grâce à @Giuseppe!
Fonction anonyme qui utilise presque la même approche que ma réponse MATL .
Essayez-le en ligne!
la source
05AB1E , 12 octets
Utilise l' encodage 05AB1E . Essayez-le en ligne!
la source
Mathematica, 62 octets
la source
Solve[2*#==m(m+1)-n(n+1)
plus court (si ça marche)?Python 2 ,
787170 octetsSept octets enregistrés, merci aux ovules et à l' épinosa
Un octet de plus économisé grâce à la remarque de neil ,
x+9
est suffisant et vérifié pour tous les nombres naturels0 <= n <= 10000
. Il a également été vérifié aux+1
lieu dex+9
, cela fonctionne également.Essayez-le en ligne!
la source
n*-~n/2
au lieu den*(n+1)/2
{n*(n+1)/2for n in range(999)}
au lieu d'expliciteset
et également utiliser{}
au lieu deset
dans la troisième ligneJavaScript (ES6),
4342 octetsEdit: 1 octet enregistré grâce à @PeterTaylor.
la source
-++s
par--s
, comme je l'ai fait dans ma version Java dérivée indépendamment mais assez similaire. (Addendum: vous devez également remplacer le test parn>0
).n>s
chèque était un hareng rouge tout le temps!node --stack_size=
pour augmenter sa taille de pile.Python 3 ,
6044 octetsMerci à @xnor pour une suggestion qui a sauvé 16 octets!
Essayez-le en ligne!
Contexte
Soit n un entier non négatif. Si n est le k ème nombre triangulaire, on a
ce qui signifie qu'il y aura une solution naturelle si et seulement si 1 + 8n est un carré parfait et impair. En clair, vérifier la parité de 1 + 8n n'est pas requise.
Comment ça marche
La fonction récursive n accepte comme argument un entier non négatif. Lorsqu'il est appelé avec un seul argument, k par défaut est 1 .
Premièrement,
(8*n+1)**.5%1
teste si n est un nombre triangulaire: si (et seulement si),(8*n+1)**.5
il donnera un entier, donc le résidu de la division par 1 donnera 0 .Si le module est égal à 0 , la
and
condition échoue, ce qui fait que f renvoie 0 . Si cela se produit lors de l'appel initial à f , notez qu'il s'agit de la sortie correcte car n est déjà triangulaire.Si le module est positif, la
and
condition est vérifiée etf(n+k,k+1)+k
exécutée. Cela appelle à nouveau f , incrémentant n de k et k de 1 , puis ajoute k au résultat.Lorsque f (n 0 , k 0 ) renvoie finalement 0 , nous sortons de la récursivité. Le premier argument du premier appel était n , le deuxième n + 1 , le troisième n + 1 + 2 , jusqu'à ce que finalement n 0 = n + 1 +… k 0 -1 . Notez que n 0 - n est un nombre triangulaire.
De même, tous ces entiers seront ajoutés à la valeur de retour la plus intérieure ( 0 ), donc le résultat de l'appel initial f (n) est n 0 - n , comme souhaité.
la source
n
récurrence, vous pouvez écriren
plutôt que(n+k)
.C # (.NET Core) ,
291281 octetsEssayez-le en ligne! Programme qui prend une chaîne en entrée et sort via le code de sortie.
10 octets enregistrés grâce à Kevin Cruijssen
la source
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])} ");}}}
for(;;)
pour faire une boucle infinie est une belle bosse, et je m'assurerai de réfléchir plus attentivement à l'utilisation de var en fait plus efficace que d'utiliser un type explicite mais en combinant les déclarations, et je suppose que vous devez être plus diligent pour supprimer les crochets inutiles. Quant au programme vs fonction, j'ai commencé avec un lambda mais je n'ai pas pu le faire fonctionner dans TIO. Je sais qu'un lien TIO n'est pas vraiment nécessaire, mais c'est quelque chose que j'aime voir dans les réponses des autres, donc je voulais au moins quelque chose de similaire dans la mienne.JavaScript (ES7),
4644 octetsEssayez-le
la source
r=x=0
marcherait?05AB1E , 8 octets
Essayez-le en ligne! ou comme suite de tests
Explication
la source
Dyalog APL, 19 octets
6 octets enregistrés grâce à @KritixiLithos
Essayez-le en ligne!
Comment?
o←0,+\⍳⍵
- attribuero
les premiers⍵
nombres triangulaireso/⍨
- filtrero
paro∊⍨⍵+o
- nombres triangulaires qui se sont additionnés avec⍵
produisent des triangulaires⊃
- et prenez le premierla source
+\⍳⍵
devrait fonctionner à la place de ce que vous utilisez pour générer les nombres triangulaires.⊃
marche au lieu de⌊/
Pari / GP , 54 octets
Essayez-le en ligne!
la source
Haskell , 56 octets
Essayez-le en ligne!
la source
Ajouter ++ , 68 octets
Essayez-le en ligne! ou consultez la suite de tests !
Même Java me bat. J'ai vraiment besoin d'ajouter des commandes set à Add ++
Comment ça marche
la source
R ,
46444341 octetsEssayez-le en ligne!
Une fonction anonyme avec un argument obligatoire
x
; calcule les premiersx+1
nombres triangulaires comme argument facultatif pour jouer quelques accolades. J'ai utiliséchoose
avant de voir la réponse Octave de Luis Mendo .J'ai rasé quelques octets de la réponse de Luis Mendo mais j'ai oublié d'utiliser la même idée dans ma réponse.
la source
Gelée , 18 octets
Essayez-le en ligne!
la source
Python 2 ,
8381 octetsEssayez-le en ligne!
la source
APL (Dyalog Classic) ,
1614 octetsEssayez-le en ligne!
la source
Clojure, 74 octets
Choisissez votre préféré :) Les boucles peuvent être plus courtes ...
la source
Python 2 , 82 octets
Essayez-le en ligne
Cela a été créé en modifiant cette réponse de la question connexe.
la source