Étant donné un entier n , le décomposer en une somme de nombres triangulaires maximaux (où T m représente le m ème nombre triangulaire, ou la somme des entiers de 1 à m ) comme suit:
tandis que n> 0 ,
trouver le plus grand nombre triangulaire possible T m tel que T m ≤ n .
ajouter m à la représentation de décomposition triangulaire de n .
soustrayez T m de n .
Par exemple, une entrée de 44 donnerait une sortie de 8311 , car:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, mais 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44.
- le premier chiffre est 8 ; soustrayez 36 de 44 pour obtenir 8 restants.
1 + 2 + 3 = 6 <8, mais 1 + 2 + 3 + 4 = 10> 8.
- le deuxième chiffre est 3 ; soustrayez 6 de 8 pour obtenir 2 restants.
1 <2, mais 1 + 2 = 3> 2.
- les troisième et quatrième chiffres doivent être 1 et 1 .
Utilisez les chiffres de 1 à 9 pour représenter les 9 premiers nombres triangulaires, puis utilisez les lettres de a à z (qui peuvent être en majuscules ou en minuscules) pour représenter le 10e au 35e nombre triangulaire. Vous ne recevrez jamais une entrée qui nécessitera l'utilisation d'un "chiffre" plus grand.
Les bornes sur l'entrée sont 1 ≤ n <666 , et ce sera toujours un entier.
Toutes les entrées et sorties possibles , et certains cas de test sélectionnés (répertoriés en entrée, puis en sortie):
1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731
Une sortie de ∞ pour une entrée de -1/12 n'est pas requise. :)
Réponses:
JavaScript (ES6), 52 octets
Comment?
Plutôt que de calculer explicitement T i = 1 + 2 + 3 +… + i , nous commençons par t = 0 et soustrayons itérativement t + 1 de n tandis que t <n , en incrémentant t à chaque itération. Lorsque la condition n'est plus remplie, un total de T t a été soustrait de n et la sortie est mise à jour en conséquence. Nous répétons le processus jusqu'à n = 0 .
Voici un résumé de toutes les opérations pour n = 100 .
Cas de test
Afficher l'extrait de code
la source
Gelée ,
1817 octetsIl s'agit d'un lien monadique qui s'imprime sur STDOUT. Sa valeur de retour est 0 et doit être ignorée.
Essayez-le en ligne!
la source
dc, 74 octets
C'est affreux.
la source
JavaScript (ES6),
6157 octets4 octets enregistrés grâce à @Arnauld
la source
f=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
f=(n,p=q=0)
etf(n,++q+p)
?Java 7, 81 octets
Port de @Arnauld « s JavaScript étonnant (ES6) réponse .
Ma propre approche était presque deux fois plus longue ..
Essayez-le ici.
Explication:
la source
Retina ,
1151083834 octets[Essayez-le en ligne!] (Comprend la suite de tests) Utilise des lettres majuscules. Edit: sauvé
7074 octets en adaptant sans vergogne la réponse de @ MartinEnder à Est-ce que ce nombre est triangulaire? Explication: Le nombre est converti en unaire, puis le plus grand nombre triangulaire possible est mis en correspondance de manière répétée jusqu'à épuisement du nombre. Chaque match est ensuite converti en base 36.la source
PHP, 74 octets
Version en ligne
la source
R, 87 octets
À l'origine, j'ai essayé de prérégler les nombres triangulaires possibles. Cela a conduit à ce code avec 105 octets:
Cela nécessitait plus d'indexation, j'ai donc essayé la méthodologie de @Arnauld pour réduire les octets à 87.
Les deux codes utilisaient les lettres prédéfinies, car je ne pouvais pas trouver un moyen rapide de convertir en base 36.
la source