Mon triangle est-il correct?


47

Etant donné a, b, cla longueur des trois côtés d’un triangle, disons si le triangle est à angle droit (c’est -à- dire qu’un angle est égal à 90 degrés) ou non.

Contribution

Trois valeurs entières positives dans n'importe quel ordre

Sortie

Soit une sortie spécifique vrai ( true, 1, yes, ...) ou une sortie de fausse spécifique ( false, 0, no, ...)

Exemple

5, 3, 4        --> yes
3, 5, 4        --> yes
12, 37, 35     --> yes
21, 38, 50     --> no
210, 308, 250  --> no

Règles

  • L'entrée et la sortie peuvent être données dans n'importe quel format pratique .
  • Dans votre soumission, veuillez indiquer les valeurs vraies et fausses.
  • Pas besoin de gérer des valeurs négatives ou un bord triple invalide
  • Un programme complet ou une fonction sont acceptables. Si une fonction est utilisée, vous pouvez renvoyer le résultat plutôt que de l’imprimer.
  • Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent tester votre code!
  • Les failles standard sont interdites.
  • Il s’agit du donc toutes les règles de golf habituelles s’appliquent et le code le plus court (en octets) gagne.

1
Devons-nous gérer des valeurs négatives ou des arêtes triples invalides?
user202729

2
Très liés . Je laisserai au reste de la communauté le soin de décider si c'est dupe.
Digital Trauma

2
Je pense que l'utilisation de coordonnées au lieu de longueurs change considérablement le défi
Luis Mendo

8
Il n'y a pas de triangle avec des longueurs 21, 38, 5, car 21 + 5 <38 . Est-ce un cas pathologique intentionnel que nous devons traiter?
Kevin

1
@ Kevin non, vous ne devez pas gérer ce cas. User202729 a déjà posé cette question :)
mdahmoune

Réponses:


37

Gelée , 5 octets

²µSHe

Essayez-le en ligne!

Note technique: Les octets sont comptés dans la page de code Jelly.

Explication:

²µSHe  Main link.
²      Square each number.
 µ     With the new list,
  S    calculate its sum,
   H   and halve it.
    e  Check if the result exists in the new list (squared input)

Le problème équivaut à recevoir trois chiffres a, b, cet à se demander s'il existe une permutation telle que a² + b² = c². Cela équivaut à savoir si (a² + b² + c²) ÷ 2est l' un a², b² or c², de sorte que le programme vérifie que juste.


bien ... je me gélifie.
Félix Gagnon-Grenier

1
Juste une note technique: les symboles ²et µcoûtent deux octets chacun en UTF-8, votre code a donc 7 octets, et non pas 5
Charlie

2
@Charlie Answer modifié pour clarification.
user202729

20

Python 2 , 37 octets

a,b,c=sorted(input())
1/(a*a+b*b-c*c)

Essayez-le en ligne!

-2 grâce à FlipTack .
-1 merci à Craig Gidney .

Sorties via le code de sortie ( 0= false, 1= true).


Bah. Entré avec la même réponse exacte. Vous pouvez modifier la suite de tests pour autoriser un nombre quelconque de tests: voir ici
mbomb007

@ mbomb007 exec(code)hmmm, pourquoi exec (code)au lieu de exec code? : D ;-p
Erik the Outgolfer

Haha, comment cette réponse a-t-elle le double des votes positifs de celle de xnor plus courte? Peut-être que les gens aiment sa douce
simplicité

1
@FlipTack ¯_ (ツ) _ / ¯ (xnor n'est pas non plus en Python 2)
Erik the Outgolfer

@EriktheOutgolfer Parce que le passe-partout ne doit pas être joué au golf. Je l'ai fait pour que cela fonctionne en Python 2 ou 3.
mbomb007

17

Java 8, 44 octets

(a,b,c)->(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Explication:

Essayez-le ici.

(a,b,c)->                // Method with three integer parameters and boolean return-type
  (a*=a)+(b*=b)==(c*=c)  //  Return if `a*a + b*b == c*c`
  |a+c==b                //  or `a*a + c*c == b*b`
  |b+c==a                //  or `b*b + c*c == a*a`
                         // End of method (implicit / single-line return-statement)

Cela fonctionne-t-il sans la parenthèse sur le (c*=c)? Il se *=peut que vous ayez une précision sur le ==et vous pouvez économiser deux octets.
CorsiKa

@corsiKa J'ai bien peur que ce soit l'inverse. ==a priorité sur *=. =, +=, *=Et missions similaires ont effectivement la priorité la plus faible des opérateurs Java .
Kevin Cruijssen

Vous ne trouvez rien de plus court ... J'ai essayé de permuter les variables pour obtenir la valeur maximale assignée a(par exemple), sans succès. Eh bien, je pourrais le faire, mais environ 65 caractères ...
Olivier Grégoire

12

JavaScript (ES6), 43 41 40 octets

Enregistré 1 octet et corrigé un bug grâce à @Neil

Prend les entrées sous forme de tableau de 3 entiers. Retourne truepour les angles droits et falseautres.

a=>a.some(n=>Math.hypot(...a,...a)==n*2)


Version originale, 44 octets

Prend l'entrée sous forme de 3 entiers. Retourne 1pour les angles droits et 0autres.

(a,b,c)=>(a*=a)+(b*=b)==(c*=c)|a+c==b|b+c==a

Cas de test


On dirait que nous sommes arrivés avec la même réponse exacte ( à l' exception de la =>et ->différence entre JavaScript et Java 8). ;) Si évident +1 de moi.
Kevin Cruijssen

>>1est dangereux, cela retourne vrai pour [1, 1, 1].
Neil

2
Que diriez- Math.hypot(...a,...a)==n*2vous
Neil

@Neil Très belle solution :)
Arnauld

2
@Neil Il devrait y avoir un ~=opérateur pour "grossièrement égal";)
JollyJoker


7

Triangulaire , 57 octets

Je n'en ai pas encore vu dans cette langue et il semblait approprié d'essayer d'en faire une. Cela a pris un peu ... car je devais commencer par comprendre et je crois que cela pourrait être joué au golf un peu plus.

,$\:$:*/%*$"`=P:pp.0"*>/>-`:S!>/U+<U"g+..>p`S:U/U"p`!g<>/

Essayez-le en ligne!

Cela s'étend au triangle suivant.

          ,
         $ \
        : $ :
       * / % *
      $ " ` = P
     : p p . 0 "
    * > / > - ` :
   S ! > / U + < U
  " g + . . > p ` S
 : U / U " p ` ! g <
> /

Le chemin est assez compliqué, mais je vais essayer d’expliquer ce que j’ai fait. Je vais sauter les pointeurs directionnels. La majeure partie du code est une manipulation de pile.

  • $:* Place la première entrée.
  • $:* Place la deuxième entrée.
  • S":Ug! Teste si la deuxième valeur est supérieure à la première.
    • true p" Échanger avec le premier.
    • faux p ne rien faire.
  • $:* Place la troisième entrée.
  • P":USg! Teste si la troisième valeur est supérieure à la plus grande de la précédente.
    • Vrai p+U- somme de la pile actuelle et enlève la troisième valeur stockée
    • fausse p"U+- somme le moins et stocké troisième et soustrayez du plus grand
  • 0=% teste l'égalité à zéro et le résultat en sortie.

6

Haskell ( 33 32 31 octets)

(\x->(sum x)/2`elem`x).map(^2)

Version originale:

(\x->2*maximum x==sum x).map(^2)

Fonction anonyme. Prend une liste sous la forme [a, b, c]. Sorties Vrai ou Faux.

Première version vérifiée si la somme des carrés était le double du carré du maximum.

Deuxièmement, une version légèrement meilleure vérifie si la moitié de la somme des carrés est un élément de la liste des carrés.

Edit: Accidentellement compté une nouvelle ligne, merci H.PWiz


1
Bienvenue sur le site! Cette réponse n’est que de 32 octets. Peut-être avez-vous compté un saut de ligne supplémentaire?
H.PWiz

3
Vous pouvez utiliser la fonction Monad pour enregistrer quelques octets supplémentaires ici
H.PWiz

de plus, les parenthèses sumpeuvent être jetées. belle solution!
fier haskeller

6

Perl 6 , 24 octets

{(*²+*²==*²)(|.sort)}

Essayez-le en ligne!

*²+*²==*²est une fonction anonyme qui retourne vrai si la somme des carrés de ses deux premiers arguments est égale au carré de son troisième argument. Nous passons la liste des entrées triées à cette fonction, en l'aplatissant dans la liste des arguments avec |.


6

R , 31 26 30 octets

cat(sum(a<-scan()^2)/max(a)==2)

Je n'aime pas autant celui-ci, mais il est plus court. Somme les carrés et divise par le plus grand carré. Vérité si 2.

Version précédente (modifiée avec le chat et avec le conseil de @ Guiseppe)

cat(!sort(scan())^2%*%c(1,1,-1))

Faites une somme de l'entrée triée avec le dernier élément annulé et renvoyez le !non.

Essayez-le en ligne!


Pour votre version précédente, !sort(scan())^2%*%c(1,1,-1)27 octets. mais je pense que vous avez encore besoin d'un cat.
Giuseppe

Cheers @Guiseppe, j'ai oublié le chat. Les règles autour de REPL m'énervent, mais elles sont ce qu'elles sont.
MickyT

@ Giuseppe Egalement sympa avec la multiplication matricielle. Je n'aurais jamais imaginé ça.
MickyT

6

Brain-Flak , 68 octets

({({({})({}[()])}{}<>)<>})<>({<(({}){}<>[({})])>(){[()](<{}>)}{}<>})

Essayez-le en ligne!

Utilise l'observation dans la réponse de user202729.

 {                      }      for each input number
   {({})({}[()])}{}            compute the square
  (                <>)<>       push onto second stack
(                        )     push sum of squares onto first stack
                          <>   move to second stack

 {                                    }    for each square
   (({}){}<>[({})])                        compute 2 * this square - sum of squares
  <                >(){[()](<{}>)}{}<>     evaluate loop iteration as 1 iff equal
(                                      )   push 1 if any squares matched, 0 otherwise


4

MATL , 7 octets

SU&0)s=

Essayez-le en ligne!

Explication

Considérez l'entrée [12, 37, 35].

S     % Implicit input. Sort
      % [12, 35, 37]
U     % Square each entry
      % [144, 1225, 1369]
&0)   % Push last entry and remaining entries
      % STACK: 1369, [144, 1225]
s     % Sum of array
      % STACK: 1369, 1369
=     % Isequal? Implicit display
      % STACK: 1

4

Python 2 , 43 octets

lambda a,b,c:(a*a+b*b+c*c)/2in(a*a,b*b,c*c)

Essayez-le en ligne!

Python 2 , 79 70 68 62 octets

lambda*l:any(A*A+B*B==C*C for A,B,C in zip(l,l[1:]+l,l[2:]+l))

Essayez-le en ligne!


Le défi a été mis à jour pour limiter les entrées aux entiers.
Martin Ender


14
A*Aest plus court ...
Socratic Phoenix

68 octets tio.run/…
mdahmoune

@mdahmoune 67 octets ; retourner les significations de la valeur de vérité et utiliser -au lieu de ==.
Jonathan Frech

4

C,  68  54 octets

Utilisation de la solution de user202729 .

f(a,b,c){return!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}

Merci à @Christoph d'avoir joué au golf 14 octets!

Essayez-le en ligne!

C, 85 octets

#define C(a,b,c)if(a*a+b*b==c*c)return 1;
f(a,b,c){C(a,b,c)C(b,c,a)C(c,a,b)return 0;}

Essayez-le en ligne!


Sorties dont les 1paramètres 1, 1, 1sont incorrects ...
Neil

@Neil C'est corrigé maintenant.
Steadybox

La question a été mise à jour pour utiliser ints, cela pourrait économiser quelques octets.
CorsiKa

f(a,b,c){a=!((a*=a)+(b*=b)-(c*=c)&&a-b+c&&a-b-c);}
Christoph


4

J, 10 octets

-6 octets grâce à FrownyFrog

=`+/@\:~*:

réponse originale

(+/@}:={:)@/:~*:

/:trier les carrés *:, puis vérifier si la somme des deux premiers +/@}:est égale à la dernière{:

Essayez-le en ligne!


c'est terriblement malin
Jonah

4

Triangularité ,  49 à  31 octets

...)...
..IEO..
.M)2s^.
}Re+=..

Essayez-le en ligne!

Explication

Chaque programme de triangularité doit avoir un rembourrage triangulaire (excusez le jeu de mots). C'est-à-dire que la i ème ligne à compter du bas du programme doit être complétée avec i - 1 points ( .) de chaque côté. Afin de garder les triangles de points symétriques et esthétiquement agréables, chaque ligne doit comporter 2L - 1 caractères, L étant le nombre de lignes du programme. En supprimant les caractères qui composent le remplissage nécessaire, voici comment le code fonctionne:

)IEOM)2s^}Re+=     Full program. Input: STDIN, Output: STDOUT, either 1 or 0.
)                  Pushes a zero onto the stack.
 IE                Evaluates the input at that index.
   O               Sorts the ToS (Top of the Stack).
    M)2s^}         Runs the block )2s^ on a separate stack, thus squaring each.
          R        Reverse.
           e       Dump the contents separately onto the stack.
            +      Add the top two items.
             =     Check if their sum is equal to the other entry on the stack (c^2).

Vérifier si un triangle est à angle droit dans Triangularity ...


3

PowerShell , 39 octets

$a,$b,$c=$args|sort;$a*$a+$b*$b-eq$c*$c

Essayez-le en ligne!

Trie l'entrée, la stocke dans des $a,$b,$cvariables. Utilise ensuite le théorème de Pythagore pour vérifier si a*a + b*b = c*c. La sortie est soit booléenne Truesoit False.


3

JavaScript 34 octets (sans D =)

D=(d,[a,b,c]=d.sort())=>a*a+b*b==c*c

console.log(D([5, 3, 4       ])== true)
console.log(D([3, 5, 4       ])== true)
console.log(D([12, 37, 35    ])== true)
console.log(D([21, 38, 5     ])== false)
console.log(D([210, 308, 15  ])== false)


J'ai eu une réponse similaire à 34: a=>a.sort()[0]**2+a[1]**2==a[2]**2dans ES6. Donc, les accessoires pour vous @DanielIndie
WallyWest

1
Malheureusement, sort()utilise l'ordre lexicographique lorsqu'aucun rappel n'est fourni, faisant échouer ce code par exemple pour [10,6,8].
Arnauld

3

RProgN 2 , 10 octets

§²2^r]‘\+e

A expliqué

§²2^r]‘\+e
§           # Sort the input list
 ²2^r       # Square each element in the list.
     ]      # Duplicate it on the reg stack.
      ‘     # Pop the top (largest) element off it
       \+   # Swap it, sum the rest of the list.
         e  # Are they equal?

Essayez-le en ligne!


Pourquoi dupliquer la liste?
mdahmoune

@mdahmoune RProgN2 ne conserve pas la liste d'origine sur la pile lors de l'extraction d'un élément, mais les piles sont référencées. Par conséquent, pour que la pile en fasse la somme, elle doit d'abord être dupliquée.
ATaco

Vote positif;)
mdahmoune

3

Raquette , 64 60 octets

(λ(a b c)(=(+(* a a)(* b b)(* c c))(*(expt(max a b c)2)2)))

Essayez-le en ligne!

Comment ça fonctionne

Teste si a^2 + b^2 + c^2est égal à la plus grande deux fois a^2, b^2et c^2.

Retourne #tpour les triangles rectangles et #fpour toutes les autres entrées.


  • -4 octets grâce à la suggestion d'utilisation de @ xnor expt.

Génial;) mais je pense que cela (define fundoit faire partie du code ...
mdahmoune

Je vous remercie! Je pense que c'est conventionnel de dire que les fonctions pures sont autorisées comme réponses. Le (define fun ...)TIO sur est simplement pour plus de commodité: nous pourrions tout aussi bien utiliser cette fonction que la fonction (... 3 4 5)où elle ...est. (Nous pourrions donc avoir une tête (print (et un pied de page 3 4 5))si vous préférez.)
Misha Lavrov

(Mais ceci est l'une de mes premières soumissions pour Racket, je ne suis donc pas très clair sur les conventions spécifiques à chaque raquette, le cas échéant. Certaines solutions antérieures utilisant Racket ont été incluses #lang racketdans le code; d'autres non.)
Misha Lavrov

1
La raquette est tellement verbeuse qu'elle est plus courte à répéter (max a b c)qu'à faire une letliaison, hein? Je ne suppose pas qu'il serait plus court de se lier comme un argument à un λ? Ou n'y a-t-il pas une exponentiation intégrée?
xnor

2
@MishaLavrov Alors que diriez-vous (*(expt(max a b c)2)2)?
xnor

3

05AB1E , 6 octets

n{R`+Q

Essayez-le en ligne!


Le premier exemple ne parvient pas à détecter [1,1,1] n’est pas une entrée valide (problème commun à d’autres tentatives), mais le second fonctionne très bien.
Nick Loughlin

@NickLoughlin Oups, premier exemple supprimé
Okx

Vous pouvez faire n{RÆ_pour sauvegarder un octet.
Emigna

3

Ruby, 31 octets

->a{a,b,c=*a.sort;a*a+b*b==c*c}

Prend la saisie sous forme de liste de 3 entiers. Utilise des idées d'autres solutions.


Je viens de réaliser que la réponse que je viens de poster est presque identique à la vôtre. Je vous promets de ne pas avoir copié le vôtre (je l'avais en fait assis pendant un moment dans la boîte "Poster une réponse"), mais puisque le vôtre a été soumis en premier, si vous pensez que le mien est trop proche, je le supprime.
Rétablir Monica iamnotmaynard

@iamnotmaynard C'est à peu près la même chose. c'était une drôle de coïncidence lol. Merci de me le faire savoir
dkudriavtsev

Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent tester votre code!
mdahmoune

3

Julia 0.6 , 16 octets

!x=xx2x.*x

Essayez-le en ligne!

Comment ça fonctionne

Soit x = [a, b, c] .

x⋅xest le produit scalaire de x et de lui-même, il donne donc a² + b² + c² .

2x.*xest le produit élément par 2x et x , donc il donne [2a², 2b², 2c²] .

Enfin, vérifie si le nombre entier a² + b² + c² appartient au vecteur [2a², 2b², 2c²] , ce qui est vrai si et seulement si
a² + b² + c² = 2a² ou a² + b² + c² = 2b² ou a² + b² + c² = 2c² , ce qui est vrai si et seulement si
b² + c² = a² ou a² + c² = b² ou a² + b² = c² .



3

TI-Basic, 13 11 10 octets

max(Ans=R►Pr(min(Ans),median(Ans

Fonctionne maintenant pour les entrées dans n’importe quel ordre et est également plus court. Un autre -1 grâce à @MishaLavrov


Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent tester votre code!
mdahmoune

Cela ne Détecte classés triangles: entrée A=5, B=4, C=3ne serait pas manipulé correctement.
Misha Lavrov

@MishaLavrov Merci de l'avoir signalé, il s'agit en fait d'une gestion plus courte sous forme de liste. Maintenant, cela fonctionne pour les entrées dans n'importe quel ordre.
Timtech

Si nous en omettons un ), alors max(Ans=R►Pr(min(Ans),median(Ansest également valide (bien que le calcul que nous effectuons ici soit différent) et ait un octet plus court.
Misha Lavrov

@MishaLavrov C'est intéressant, je vois ce que vous voulez dire. Je pense que les expressions sont équivalentes pour toutes les entrées non négatives.
Timtech

3

CJam, 9

q~$W%~mh=

Essayez-le en ligne

Explication:

q~      read and evaluate the input (given as an array)
$W%     sort and reverse the array
~       dump the array on the stack
mh      get the hypotenuse of a right triangle with the given 2 short sides
=       compare with the longer side

Quelques explications;)?
mdahmoune

@mdahmoune et voilà
aditsu

Dang it. Vous n'avez pas écrit cette langue? Cela ne semble pas juste. (blague)
kaine

3

Pari / GP , 29 à 24 octets

f(v)=v~==2*vecmax(v)^2

Essayez-le en ligne!

Sauvegardé cinq octets par un changement évident de norml2(v)à v*v~.

Inspiré par d'autres réponses.

Ici, il vdoit s'agir d'un vecteur ligne ou d'un vecteur colonne avec trois coordonnées.

Exemple d'utilisation: f([3,4,5])

Bien sûr, vous obtenez des longueurs de côté rationnelles gratuitement, par exemple f([29/6, 10/3, 7/2]).

Si je ne compte pas la f(v)=partie, c'est 19 octets. La première partie peut également être écrite v->(total 22 octets).

Explication: Si les trois coordonnées vsont x, yet z, alors le produit vet sa transposition v~donne un scalaire x^2+y^2+^z^2, et nous devons vérifier si cela est égal à deux fois la place du maximum des coordonnées x, y, z.

Extra: Les mêmes ftests pour un quadruple de Pythagore si votre vecteur d’entrée a quatre coordonnées, et ainsi de suite.


Si possible, veuillez inclure un lien vers un environnement de test en ligne afin que d'autres personnes puissent tester votre code!
mdahmoune

@mdahmoune Vous pouvez utiliser ce tio.runlien . Cependant, il est bien plus agréable d’installer PARI / GP localement.
Jeppe Stig Nielsen

3

MS Excel, 49 octets

Fonction de feuille de travail anonyme qui prend des entrées dans la plage [A1: C1] et les envoie à la cellule appelante.

=OR(A1^2+B1^2=C1^2,B1^2+C1^2=A1^2,A1^2+C1^2=B1^2)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.