La description
Il y a eu pas mal d'autres défis concernant ces chiffres auparavant, et j'espère que celui-ci n'en fait pas partie.
Le n ème nombre triangulaire est égal à la somme de tous les nombres naturels jusqu'à n , trucs simples. Il y a une page wikipedia et une entrée à OEIS , pour ceux qui souhaitent s'informer davantage.
Maintenant, Gauss a découvert que chaque nombre naturel peut être exprimé comme une somme de trois nombres triangulaires (ceux-ci incluent 0
), et il est bon d'avoir un nombre plus d'une fois, par exemple 0 + 1 + 1 = 2
.
Défi
Votre tâche consiste à écrire un programme ou une fonction, étant donné un nombre naturel (y compris 0
), imprime trois nombres triangulaires qui résument l'argument. Vous pouvez imprimer les nombres séparés par des espaces, comme un tableau ou par une autre méthode que vous aimez. Cependant, il est interdit d'utiliser des fonctions intégrées pour obtenir directement un tableau, une plage ou toute autre forme de collection contenant une liste de nombres triangulaires (par exemple un seul atome qui donne la plage).
Cas de test
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Remarque: S'il existe plusieurs combinaisons possibles, vous pouvez imprimer une ou toutes les combinaisons, mais vous ne devez imprimer une seule combinaison qu'une seule fois, en éliminant toutes les combinaisons résultant de la réorganisation d'autres combinaisons. J'apprécierais vraiment un lien d'essai et une explication, j'aime vraiment voir comment vous résolvez le problème;)
Il s'agit de code-golf , donc les failles standard s'appliquent. Que la réponse la plus courte en octets gagne!
la source
a
ne sera pas toujours un nombre triangulairen
et renvoient une liste des premiersn
nombres triangulaires sont-elles autorisées? Cela semble plutôt ciblé par rapport à un langage spécifique, même si je ne sais pas lequel.Réponses:
05AB1E , 10 octets
Code:
Explication:
Utilise l' encodage 05AB1E . Essayez-le en ligne!
la source
Python 2 , 99 octets
Essayez-le en ligne!
Je suis assez étonné que ce soit plus court que
itertools
ou une compréhension de la triple liste! Il (éventuellement) crache une réponse aléatoire à chaque fois que vous l'exécutez.Deux 102:
itertools semble être de 106:
la source
Gelée , 12 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Brachylog , 13 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
MATL , 18 octets
Cela produit le premier résultat dans l'ordre lexicographique.
Essayez-le sur MATL Online!
Explication
la source
Haskell,
6659 octetsMerci d'avoir permis de produire toutes les solutions, c'était une distraction fascinante! J'étais tellement heureux de ne pas avoir besoin d'extraire une seule solution et de pouvoir leur donner tout ce que je n'ai pas remarqué le coût qui découle de l'évitement des solutions permutées. @ La remarque de Lynn m'a expliqué cela et m'a permis d'économiser 7 octets.
Cela lie plus que suffisamment de nombres triangulaires
l
et vérifie toutes les combinaisons.la source
a>=b,b>=c
conditions et le suffixe!!0
de votre code ne sont-ils pas également une réponse valide? La sortie de toutes les solutions ne vous aide pas vraiment ici.Rétine ,
6359 octetsEssayez-le en ligne! Le lien inclut des cas de test.
(1(?(1)\1))*
est un comparateur de nombres triangulaires généralisé, mais pour le premier nombre triangulaire, nous pouvons économiser quelques octets en utilisant^
pour la correspondance initiale.la source
PHP , 351 octets
Essayez-le en ligne!
la source
Python 3 , 119 octets
Essayez-le en ligne!
Merci à @WheatWizard pour avoir économisé 12 octets!
la source
map
(et peut-être votre filtre) peut être écrit plus court comme une compréhension de liste.map
[*filter(...)]
(x,y,z) for x,y,z in...
qui est plus long que le vôtre,l for l in...
ce qui explique probablement cette différence.C / C ++ - 197 octets
Coup par coup:
Nécessaire pour printf. Pourrait être élidé pour certaines versions de C
Économie d'espace pour la boucle.
Évaluateur de triangle récursif.
Ce gars fait le gros du travail. Trois boucles imbriquées pour itérer a, b, c de 0 à n, notez que b et c itèrent chacun de la valeur précédente jusqu'à n. Il n'est pas strictement nécessaire de couper l'itération comme ça, car l'
return
arrivée en une minute résout le problème de "doublon".Au niveau intérieur, si la somme des trois triangles numérote
==
la valeur souhaitée, imprimez les triangles et revenez.Vous pouvez supprimer légalement le
return
mot - clé et convertir le type de retour de c en void pour économiser quelques octets de plus et imprimer toutes les solutions possibles. Il est pour cette raison que les itérations sont limitées, si toutes les boucles allaient de0
lan
lui causerait des doublons.la source
Mathematica, 63 octets
la source
First
qui sauve un énorme 2 octets ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
pour 62 octets.CJam , 26 octets
Port de ma réponse MATL. Il s'agit d'un bloc anonyme qui attend l'entrée sur la pile et la remplace par le tableau de sortie.
Essayez-le en ligne!
la source
R , 66 octets
Algorithme de force brute; lit à
n
partir de stdin et renvoie une trame de données où chaque ligne est une combinaison de 3 nombres triangulaires qui s'additionnentn
. Si nécessaire, je peux renvoyer uniquement la première ligne pour +4 octets.Essayez-le en ligne!
la source
Java 8, 164 octets
Explication:
Essayez-le ici.
la source
JavaScript, 108 octets
Explication
x
représente l'entréewhile(a<=x)r.push(a=i++*i/2)
Crée un tableau de tous les nombres triangulaires jusqu'à xLa
for
boucle imprime le plus grand nombre triangulaire inférieur àx
, puis soustrait ce nombre àx
, pour trois itérations. (essentiellement un algorithme gourmand)la source
x = 103
:91 + 10 + 1 = 102
Pyth, 19 octets
Je suis tellement hors de pratique avec Pyth, c'est faux: /
Essayez-le ici .
la source
J , 36 octets
Essayez-le en ligne!
la source
Rubis
615755 octetsInspiré par la réponse Python de Lynn . Il génère des triplets aléatoires jusqu'à ce que la somme souhaitée soit atteinte:
Il nécessite Ruby 2.4. Dans Ruby 2.3 et versions antérieures, il s'agit d'une erreur de syntaxe et elle
Range#sum
n'est pas définie. Cette version plus longue (64 octets) est nécessaire pour Ruby 2.3:Voici un petit test:
Essayez-le en ligne avec Ruby 2.3!
la source
Javascript (ES6), 108 octets - corrigé
Prend un entier comme entrée, génère un tableau
[a, b, c]
contenant une liste triée de nombres de trianglea + b + c = x
, oùa
est le plus grand nombre de triangle inférieur ou égal à l'entrée, etb
est le plus grand nombre de triangle inférieur ou égal au moins d'entréea
.Explication
Afficher l'extrait de code
la source
x-m-n
un nombre triangulaire, c'est-à-dire pourquoi cela fonctionne-t-il?