Étant donné une liste d'entiers positifs, trouvez le nombre de triangles que nous pouvons former de telle sorte que leurs longueurs latérales soient représentées par trois entrées distinctes de la liste d'entrée.
(L'inspiration vient de CR .)
Détails
- Un triangle peut être formé si toutes les permutations des trois longueurs latérales satisfont l' inégalité stricte du triangle (Cela signifie , et doivent tous tenir.)
- Les trois longueurs latérales doivent apparaître à des positions distinctes dans la liste, mais ne doivent pas nécessairement être distinctes deux à deux.
- L'ordre des trois nombres dans la liste d'entrée n'a pas d'importance. Si nous considérons une liste
a
et les trois nombresa[i], a[j], a[k]
(oùi,j,k
sont différents deux par deux),(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
etc., tous sont considérés comme le même triangle. - La liste des entrées peut supposer contenir au moins 3 entrées.
- Vous pouvez supposer que la liste d'entrée est triée par ordre croissant.
Exemples
Un petit programme de test peut être trouvé ici sur Essayez-le en ligne!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Pour l'entrée de [1,2,3,...,n-1,n]
ceci est A002623 .
Pour l'entrée de [1,1,...,1]
(longueur n
), c'est A000292 .
Pour l'entrée des premiers n
numéros de Fibonacci ( A000045 ), c'est A000004 .
[1,1,1,1]
permet de choisir 4 triangles "différents", tous[1,1,1]
en utilisant l'un des 1? Mais ce n'est pas 24 parce que les trois 1 sont choisis sans ordre, c'est-à-dire que c'est un sous-ensemble de trois indices plutôt qu'une liste ordonnée?Réponses:
R ,
62524034 octetsEssayez-le en ligne!
Solution Octave du port de Luis Mendo
Depuis
a<=b<=c
, la condition du triangle est équivalente àa+b-c>0
. Lea+b-c
est succinctement capturé par le produit matriciel[1,1,-1] * X
, oùX
se trouvent les 3 combinaisons du tableau d'entrée.Il y avait beaucoup de suggestions d'améliorations faites par 3 personnes différentes dans les commentaires:
Robert S. pour avoir suggéré
scan
.Robin Ryder pour avoir suggéré des améliorations à l'inégalité du triangle et cette étrange qui nécessite que l'entrée soit dans l' ordre décroissant (ce qui montre juste à quel point un format d'entrée flexible est important).
et enfin Nick Kennedy pour ce qui suit:
R , 40 octets
Essayez-le en ligne!
la source
x[3]<x[1]+x[2]
est équivalent à2*x[3]<sum(x)
: 51 bytes[
alias est lisse, nettoie vraiment l'approche.Stax ,
87 octetsMerci à récursif pour -1!
Exécutez-le et déboguez-le sur staxlang.xyz!
Déballé (8 octets) et explication:
C'est une astuce intéressante. Si vous avez une séquence d'instructions qui se traduira toujours par 0 ou 1 et que vous devez compter les éléments d'un tableau qui donnent le résultat véridique à la fin de votre programme,
F..+
est un octet plus court que{..f%
.Suppose que la liste initiale est triée par ordre croissant. Sans cette hypothèse, collez un
o
au début pour 8 octets.la source
r3SFE+<+
packs à 7. Il utilise une boucle foreach pour ajouter les résultats du filtre. L'addition est l'une des opérations qui est un no-op lorsqu'un seul élément est présent.Haskell , 49 octets
Essayez-le en ligne!
Génère récursivement toutes les sous-séquences de
l
(inversé) et vérifie quelles longueurs 3 forment des triangles.50 octets
Essayez-le en ligne!
La même idée, générer les sous-séquences avec
mapM
, en mappant chaque valeurl
soit à elle-même (inclure) soit0
(exclure).50 octets
Essayez-le en ligne!
Essaie chaque point de partition pour prendre l'élément central
b
.51 octets
Essayez-le en ligne!
La fonction
q=scanr(:)[]
génère la liste des suffixes. Beaucoup de problèmes proviennent de la nécessité d'envisager d'inclure des éléments égaux le bon nombre de fois.52 octets
Essayez-le en ligne!
La fonction d'assistance
q=scanr(:)[]
génère la liste des suffixes.57 octets
Essayez-le en ligne!
la source
Brachylog , 11 octets
Essayez-le en ligne!
J'ai peut-être oublié de profiter de l'entrée triée dans mon ancienne solution:
Brachylog ,
181715 octetsEssayez-le en ligne!
la source
Perl 6 , 35 octets
Essayez-le en ligne!
Explication
C'est un code quelconque, c'est-à-dire une notation concise pour les fonctions lambda (qui ne fonctionne que dans des cas très simples). Chacun
*
est un espace réservé pour un argument. Nous prenons donc la liste des longueurs (qui apparaît en premier*
), faisons toutes les combinaisons de 3 éléments (elles sortent toujours dans le même ordre que dans la liste d'origine, ce qui signifie que les combinaisons sont également triées), aplatissons la liste, puis prenez la liste 3 par 3, et filtrez (grep
) uniquement les triplets qui satisfont*+*>*
, c'est-à-dire que la somme des deux premiers arguments est supérieure au troisième. Cela donne tous les triplets, et nous les comptons finalement en forçant le contexte numérique avec a+
.(Bien sûr, nous devons le tester uniquement pour le cas de "somme de deux plus petits> le plus grand". Si cela est vrai, l'autre tient trivialement, si ce n'est pas le cas, le triplet ne dénote pas des longueurs de triangle correctes et nous ne le faisons pas besoin de chercher plus loin.)
la source
Rétine , 55 octets
Essayez-le en ligne! Le lien inclut des cas de test, mais avec les valeurs du 5e cas réduites pour lui permettre de se terminer aujourd'hui. Suppose une entrée triée. Explication: les expressions rationnelles n'aiment pas vraiment correspondre à plus d'une chose. Un regex normal serait capable de trouver toutes les valeurs qui pourraient être la jambe la plus courte d'un triangle. L'
v
option de Retina n'aide pas ici, sauf pour éviter une anticipation. Cependant, l'w
option Retina est légèrement plus utile, car elle pourrait trouver la jambe la plus courte et la plus longue en même temps. Ce n'est pas suffisant pour ce défi, car il peut y avoir plusieurs jambes centrales.Convertissez l'entrée en unaire.
Pour chaque numéro d'entrée ...
... créez une ligne qui est le tableau d'origine tronqué pour commencer à ce nombre.
$'
signifie normalement la chaîne après la correspondance, mais le<
modifie pour signifier la chaîne après le séparateur précédent, évitant de gaspiller 2 octets$&
. Chaque ligne représente donc toutes les solutions potentielles en utilisant ce nombre comme la jambe la plus courte.Pour chacune de ces lignes, trouvez toutes les jambes moyennes et les plus longues possibles, mais assurez-vous que la différence est inférieure à la première jambe. Générez un
_
pour chaque combinaison de jambes correspondante.Comptez le nombre total de triangles trouvés.
la source
Python 3 , 73 octets
Essayez-le en ligne!
la source
Python 2 , 72 octets
Essayez-le en ligne!
73 octets
Essayez-le en ligne!
la source
05AB1E ,
12109 octetsMa première utilisation de 05AB1E! Merci à [Grimy] pour -1!
Essayez-le en ligne!ou suite de tests
Un port direct de ma réponse Stax. Obtenez toutes les combinaisons de trois entrées et comptez celles qui pourraient éventuellement former des triangles. C'est cette partie de comptage qui m'a vraiment attiré. J'y passe une charge d'octets. Lié à une erreur de recrue là-bas.
la source
ì
(inverser chacun) avant le filtre au lieu duŠ
(triple échange) à l'intérieur du filtre. Alternativement, vous pouvez également utiliserε...}O
au lieu deʒ...}g
, mais le nombre d'octets reste le même. PS: Votre nombre d'octets de 10 et TIO sont corrects, mais votre réponse réelle a toujours un explicite inutiley
qui peut être supprimé. :) Belle première réponse cependant, donc +1 de ma part.3.ÆʒRÆd_}g
, c'est le même nombre de fois.3.Æʒ`α›}g
c'est 9.JavaScript (ES6), 63 octets
Essayez-le en ligne!
la source
Octave / MATLAB, 33 octets
Essayez-le en ligne!
la source
Zsh , 66 octets
Essayez-le en ligne!
Relativement simple, tirant parti de l'entrée triée et incrémentant dans l'en-
for
tête (l'incrément se produit une fois par boucle parent ).la source
Excel VBA,
171164152 octets-26 octets grâce à TaylorScott
L'entrée est dans la plage
A:A
de la feuille active. La sortie est vers la fenêtre immédiate.Étant donné que cela examine chaque combinaison de chaque cellule d'une colonne de 2 à 20 cellules (soit près de 2 60 combinaisons), ce code n'est ... pas rapide. Vous pourriez le rendre beaucoup plus rapide mais au détriment des octets.
la source
()
dans l'instruction secondaire, l'espaceDebug.? r
et peut tomberNext:Next:Next
àNext k,j,i
. à part ça - enfin ça fait encore 2 ** 60 combinaisons mais ça marcher=r-(a+b>c)*(b+c>a)*(c+a>b)
Fusain , 17 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Suppose une entrée triée. Explication:
la source
Japt
-x
, 9 octetsEssayez-le
Essayez-le
la source
Wolfram Language (Mathematica) ,
3735 octetsEssayez-le en ligne!
la source
Rubis , 41 octets
Essayez-le en ligne!
la source
Pyth , 14 octets
Essayez-le en ligne!
Alternative (également 14 octets):
la source
Perl 5 (
-p
),5552 octetsen utilisant regex backtracking, -3 octets grâce à @Cows quack using
^
au lieu de(?!)
to fail et backtrack.ou
TIO
la source
(?!)
être^
?Gelée , 9 octets
Essayez-le en ligne!
Un lien monadique prenant comme argument une liste triée d'entiers et renvoyant le nombre de triangles.
Explication
Alternative 9s:
la source
J , 40 octets
Essayez-le en ligne!
la source
Bash , 123 octets
Essayez-le en ligne!
Un plaisir.
la source
SNOBOL4 (CSNOBOL4) , 181 octets
Essayez-le en ligne!
Force bruteO ( n3) algorithme. Prend les entrées sous forme de liste séparée par des sauts de ligne et sort le nombre de triangles, ou une ligne vide pour
0
. Ceci est probablement permis car SNOBOL traite la chaîne vide comme0
pour les calculs numériques.la source
C (clang) , 83 octets
Essayez-le en ligne!
Enregistré 1 grâce à @ceilingcat
la source