Côté triangle Côté Côté Côté

17

Étant donné les trois côtés d'un triangle, imprimez la zone de ce triangle.

Cas de test:

Dans: 2,3,4

Sortie: 2.90473750965556

Dans: 3,4,5

Sortie: 6

Supposons que les trois côtés a, b, c toujours a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

chyanog
la source

Réponses:

6

J, 23 19 caractères

   (4%~2%:[:*/+/-0,+:)

   (4%~2%:[:*/+/-0,+:) 2 3 4
2.90474

   (4%~2%:[:*/+/-0,+:) 3,4,5
6

Version 17 caractères si l'entrée est en i:4%~%:*/(+/,+/-+:)i

version originale de 23 caractères: (%:@(+/**/@(+/-+:))%4:)

randomra
la source
7

APL 21 20

Prend la saisie d'écran via ← ⎕

(×/(+/t÷2)-0,t←⎕)*.5
Graham
la source
6

Python 2, 53

t=input()
s=a=sum(t)/2.
for x in t:a*=s-x
print a**.5

Contribution: 2,3,4

Production: 2.90473750966

tremblement de terre
la source
3
J'ai perdu beaucoup de temps à essayer de trouver une meilleure solution. Je suis convaincu que c'est aussi bon que possible
jamylak
2
@jamylak vous et moi tous les deux;)
primo
6

Mathematica 23

√Times@@(+##/2-{0,##})&
chyanog
la source
Juste un commentaire de côté. Nous essayons (généralement) de fournir du code Mma en tant que fonctions ici. Par exemple dans votre casSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr belisarius
2
28 caractères, en fonction (Tr@#Times@@(Tr@#-2#))^.5/4&, ou 27 en utilisant une variable
Dr. belisarius
@belisarius Merci pour votre suggestion.
chyanog
5

Python 57 octets

a,b,c=input()
s=(a+b+c)*.5
print(s*(s-a)*(s-b)*(s-c))**.5

Utilisation de la formule de Heron .

Exemple d'utilisation:

$ echo 2,3,4 | python triangle-area.py
2.90473750966

$ echo 3,4,5 | python triangle-area.py
6.0

Une variante de 58 octets:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
primo
la source
Je ne connais pas très bien le python, mais pourquoi la ligne 2 *.5au lieu de /2?
jdstankosky
@jdstankosky L'opérateur de division en Python est par défaut une division entière, de sorte que si la somme de a+b+cest impair, le résultat sera erroné. Cela a changé en Python 3, bien que la plupart des soumissions de golf soient supposées être Python 2.7 sauf indication contraire (tout comme les soumissions Perl sont supposées être 5.10+, et non Perl 6).
primo
3
Vous pouvez simplement dire "Python 3" au lieu de "Python".
Joe Z.
1
@JoeZ. Nan. C'est Python 2; en Python 3, input () renvoie une chaîne, rompant cette solution.
Khuldraeseth na'Barya
4

GolfScript, 38 caractères

~].~++:d\{2*d\-*}/'"#{'\+'**0.5/4}"'+~

Étant donné que la question ne spécifiait pas autrement, j'ai choisi de travailler uniquement sur des longueurs entières. Les côtés doivent être indiqués sur STDIN séparés par des espaces.

Exemple:

> 2 3 4
2.9047375096555625
Howard
la source
3

K, 23

{sqrt s**/(s:.5*+/x)-x}

Exemple

k){sqrt s**/(s:.5*+/x)-x} 2 3 4
2.904738
tmartin
la source
3

APL, 23 20 caractères

{(×/(+/⍵÷2)-0,⍵)*÷2} 2 3 4

Exemple:

> {(×/(+/⍵÷2)-0,⍵)*÷2} 2 3 4
2.90474
Howard
la source
3

R: 48 43 caractères

f=function(...)prod(sum(...)/2-c(0,...))^.5

En utilisant également la formule de Heron mais en profitant de la vectorisation de R.
Merci à @flodel pour l'idée des points de suspension.

Usage:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
plannapus
la source
vous pouvez déposer les accolades. Et vous pouvez gagner plus en utilisant des points de suspension: function(...)prod(sum(...)/2-c(0,...))^.5. Ou même function(x)prod(sum(x)/2-c(0,x))^.5si vous appelez votre fonction avec un vecteur.
flodel
@flodel merci! Je n'ai pas pensé aux ellipses, c'est sympa.
plannapus
2

Javascript, 88 85

v=prompt().split(/,/g);s=v[0]/2+v[1]/2+v[2]/2;Math.sqrt(s*(s-v[0])*(s-v[1])*(s-v[2]))

Pas bon mais amusant :) Aussi Heron ... Démontre la non-golfabilité de problèmes simples dans JS lol

Remarque : exécutez à partir de la console pour voir le résultat.

88-> 85: supprimé a, bet c.

tomsmeding
la source
1
Vous pouvez économiser un peu en ne divisant que 2 fois. Et vous ne gagnez rien en affectant aux variables: (a=v[0])aest plus long que v[0]v[0].
Peter Taylor
Si je divisais par 2 une seule fois, comme s=(v[0]+v[1]+v[2])/2avec a, b, c = 3,4,5 se traduirait par "345"/2=172.5" and not 6. Improved without un , b` et ccependant.
tomsmeding
Ah, le merveilleux système de type de JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2et changez l'autre -en +. C'est un nombre pair de termes, donc il s'annule.
Peter Taylor
2

Mathematica 20 16 ou 22 18 octets

Avec 4 octets enregistrés par @swish.

Cela renvoie une réponse exacte:

Area@SSSTriangle@

Exemple

Area@SSSTriangle[2,3,4]

image


Pour renvoyer la réponse sous forme décimale, deux octets supplémentaires sont nécessaires.

N@Area@SSSTriangle[2,3,4]

2.90474

DavidC
la source
La composition rase quelques octetsArea@*SSSTriangle
swish
@swish Merci, très apprécié.
DavidC
1

Haskell: 51 (27) caractères

readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)

Une mise en œuvre très simple de la formule de Heron. Exemple d'exécution:

Prelude> readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)
[2,3,4]
2.9047375096555625
Prelude>

Notez qu'il accepte toute entrée numérique, pas seulement les entiers. Et si l'entrée est déjà en l, la solution ne doit comporter que 36 caractères, et si nous ne souhaitons pas imprimer la réponse, la solution ne doit comporter que 30 caractères. De plus, si nous pouvons nous permettre de changer le format d'entrée, nous pouvons supprimer 3 caractères supplémentaires. Donc, si notre entrée ressemble à [2,3,4,0.0] et est déjà dans l, nous pouvons obtenir notre réponse avec seulement:

sqrt$product$map(sum l/2-)l

Exemple d'exécution:

Prelude> let l = [2,3,4,0.0]
Prelude> sqrt$product$map(sum l/2-)l
2.9047375096555625
Prelude>
Fors
la source
1

PHP, 78 77

<?=sqrt(($s=array_sum($c=fgetcsv(STDIN))/2)*($s-$c[0])*($s-$c[1])*$s-=$c[2]);

Utilisation:

php triangle.php
2,3,4

Production: 2.9047375096556

Je ne pense pas que je puisse le raccourcir? Je suis encore nouveau au golf. N'importe qui m'a fait savoir si j'avais oublié quelque chose.

Merci Primo de m'avoir sauvé 1 octet, lol.

jdstankosky
la source
1
La finale ($s-$c[2])peut être remplacée par $s-=$c[2]un octet, mais c'est tout ce que je peux voir.
primo
@primo Merci, mec!
jdstankosky
1

JavaScript (84 86 )

s=(eval('abc '.split('').join('=prompt()|0;'))+a+b)/2;Math.sqrt(s*(s-a)*(s-b)*(s-c))

Une autre solution JavaScript basée sur la formule de Heron, mais essayant une approche différente pour le chargement des variables. Doit être exécuté à partir de la console. Chaque côté est entré dans une invite distincte.

EDIT : Utilisez la valeur de retour de evalpour enregistrer 2 caractères. Beats @tomsmeding, wahoo! :)

mellamokb
la source
1

Excel, 42 octets

Basé sur la formule de Heron, l'algèbre du secondaire au golf.

=SQRT(((A1+B1)^2-C1^2)*(C1^2-(A1-B1)^2))/4

Ungolfed / Unalgebra'ed

=SQRT((A1+B1+C1)/2*(((A1+B1+C1)/2)-A1)*(((A1+B1+C1)/2)-B1)*(((A1+B1+C1)/2)-C1))
Wernisch
la source
1

Japt , 17 16 15 octets

½*Nx
NmnU ×*U q

Essaye-le

Enregistrement de 2 octets grâce à ETH indiquant une nouvelle ligne redondante et quelques façons alternatives de réduire le tableau.

Hirsute
la source
Je pense que vous pouvez utiliser l' un de ces pour la deuxième ligne, aussi: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions
1

Tcl, 74 caractères.

proc R {a b c} {set s ($a+$b+$c)/2.
expr sqrt($s*($s-$a)*($s-$b)*($s-$c))}

Passez les côtés en argument.

Pour l'entrée, 2 3 4la valeur de sest (2+3+4)/2.sous forme de chaîne. Double évaluation FTW.

Johannes Kuhn
la source
En tant que proc, il s'étend à seulement 81 octets: tio.run/##NYo7CoAwEAV7T/…
sergiol
1

Julia 0.6.0, 48 octets

Fondamentalement, la formule de héron:

f(a,b,c)=(p=(a+b+c)/2;sqrt(p*(p-a)*(p-b)*(p-c)))
Goysa
la source
1

TI-BASIC, 14 12 octets

4⁻¹√(sum(Ansprod(sum(Ans)-2Ans

À partir d'une routine de formule Heron écrite par Kenneth Hammond (Weregoose) , j'ai joué deux octets au golf . Notez que TI-BASIC est tokenisé, et chaque token, commeAns et prod(, est un ou deux octets dans la mémoire de la calculatrice.

Entrée via Ans ie sous la forme{a,b,c}:[program name] .

Expliqué:

                   sum(Ans)-2*Ans   (a+b+c)-2{a,b,c}={b+c-a,c+a-b,a+b-c}
          Ans*prod(                 {a,b,c}*(b+c-a)(c+a-b)(a+b-c)
      sum(                          (a+b+c)(b+c-a)(c+a-b)(a+b-c)
4⁻¹*√(                              √((a+b+c)(b+c-a)(c+a-b)(a+b-c)/16)
                                    =√(s(s-a)(s-b)(s-c))
lirtosiast
la source
J'ai converti cela en wiki communautaire car ce n'est pas votre propre travail. Nous n'avons pas vraiment de consensus solide à ce sujet, mais n'hésitez pas à peser ici si vous n'êtes pas d'accord avec ma décision.
Martin Ender
0
#include<stdio.h>
#include<math.h>
main()
{
  double a,b,c,s,area;
  scanf("%d %d %d" &a,&b,&c);
  s=sqrt((a*a)+(b*b)+(c*c));
  area=[sqrt(s*(s-a)*(s-b)*(s-c))]/2;
}
sharath
la source
Salut iam débutant de programmation, si des erreurs me suggèrent.
sharath
Bienvenue sur CodeGolf. Vous devez d'abord vérifier que le programme fonctionne et en quelque sorte génère le résultat. Il y a quelques bugs simples dans celui-ci.
ugoren
0

APL (NARS), 16 caractères, 32 octets

{√×/(+/⍵÷2)-0,⍵}

Il faut convertir la formule Erone si a, b, c sont les côtés du triangle

p   =(a+b+c)/2 
Area=√p*(p-a)(p-b)(p-c)

au langage APL ... test

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
RosLuP
la source