Área del triángulo lado lado lado

17

Dados los tres lados de un triángulo, imprime el área de este triángulo.

Casos de prueba:

En: 2,3,4

Fuera: 2.90473750965556

En: 3,4,5

Fuera: 6

Suponga que los tres lados a, b, c siempre a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

chyanog
fuente

Respuestas:

6

J, 23 19 caracteres

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

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

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

Versión de 17 caracteres si la entrada está en i:4%~%:*/(+/,+/-+:)i

versión original de 23 caracteres: (%:@(+/**/@(+/-+:))%4:)

randomra
fuente
7

APL 21 20

Toma entrada de pantalla a través de ← ⎕

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

Pitón 2, 53

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

Entrada: 2,3,4

Salida: 2.90473750966

flornquake
fuente
3
Perdí mucho tiempo tratando de encontrar una mejor solución. Estoy convencido de que esto es tan bueno como puede ser
jamylak
2
@jamylak tú y yo los dos;)
primo
6

Mathematica 23

√Times@@(+##/2-{0,##})&
chyanog
fuente
Solo un comentario aparte. Aquí (generalmente) intentamos proporcionar el código Mma como funciones aquí. Por ejemplo en su casoSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr. belisario
2
28 caracteres, como una función (Tr@#Times@@(Tr@#-2#))^.5/4&, o 27 usando una variable
Dr. belisarius
@belisarius Gracias por tu sugerencia.
Chyanog
5

Python 57 bytes

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

Usando la fórmula de Heron .

Uso de la muestra:

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

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

Una variante de 58 bytes:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
primo
fuente
No estoy terriblemente familiarizado con Python, pero ¿por qué es la línea 2 en *.5lugar de /2?
jdstankosky
@jdstankosky El operador de división en Python es, por defecto, la división de enteros, de modo que si la suma de a+b+ces impar, el resultado será erróneo. Esto cambió en Python 3, aunque se supone que la mayoría de las presentaciones de golf son Python 2.7 a menos que se especifique lo contrario (al igual que se supone que las presentaciones de Perl son 5.10+ y no Perl 6).
primo
3
Usted podría decir "Python 3" en lugar de "Python".
Joe Z.
1
@JoeZ. No Este es Python 2; en Python 3, input () devuelve una cadena, rompiendo esta solución.
Khuldraeseth na'Barya
4

GolfScript, 38 caracteres

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

Como la pregunta no especificaba lo contrario, elegí trabajar solo en longitudes de enteros. Los lados se deben dar en STDIN separados por espacios.

Ejemplo:

> 2 3 4
2.9047375096555625
Howard
fuente
3

K, 23

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

Ejemplo

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

APL, 23 20 caracteres

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

Ejemplo:

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

R: 48 43 caracteres

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

Usando la fórmula de Heron también pero aprovechando la vectorización de R.
Gracias a @flodel por la idea de los puntos suspensivos.

Uso:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
plannapus
fuente
puedes soltar las llaves. Y se puede ganar más mediante el uso de puntos suspensivos: function(...)prod(sum(...)/2-c(0,...))^.5. O incluso function(x)prod(sum(x)/2-c(0,x))^.5si llama a su función con un vector.
flodel
@flodel gracias! No pensé en los puntos suspensivos, eso es bueno.
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]))

No es bueno pero divertido :) También Heron ... Demuestra la falta de resolución de problemas simples en JS lol

Nota : ejecute desde la consola para ver el resultado.

88-> 85: eliminado a, by c.

tomsmeding
fuente
1
Puede ahorrar un poco dividiendo solo entre 2 una vez. Y en realidad no ganas nada asignando variables: (a=v[0])aes más largo que v[0]v[0].
Peter Taylor
Si dividiera por 2 solo una vez, como s=(v[0]+v[1]+v[2])/2con a, b, c = 3,4,5 resultaría en "345"/2=172.5" and not 6. Improved without a , b` y csin embargo.
Tomsmeding
Ah, el maravilloso sistema de tipos de JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2y cambia el otro -a +. Es un número par de términos, por lo que se cancela.
Peter Taylor
2

Mathematica 20 16 o 22 18 bytes

Con 4 bytes guardados por @swish.

Esto devuelve una respuesta exacta:

Area@SSSTriangle@

Ejemplo

Area@SSSTriangle[2,3,4]

imagen


Para devolver la respuesta en forma decimal, se requieren dos bytes adicionales.

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

2.90474

DavidC
fuente
La composición reduce un par de bytesArea@*SSSTriangle
swish
@swish Gracias, muy apreciado.
DavidC
1

Haskell: 51 (27) personajes

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

Una implementación muy directa de la fórmula de Heron. Ejemplo de ejecución:

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

Tenga en cuenta que acepta cualquier entrada numérica, no solo enteros. Y si la entrada ya está en l, la solución solo debe tener 36 caracteres, y si no estamos interesados ​​en imprimir la respuesta, la solución solo debe tener 30 caracteres. Además, si podemos permitirnos cambiar el formato de entrada, podemos eliminar 3 caracteres más. Entonces, si nuestra entrada se ve como [2,3,4,0.0] y ya está en l, podemos obtener nuestra respuesta solo con:

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

Ejemplo de ejecución:

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

PHP, 78 77

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

Uso:

php triangle.php
2,3,4

Salida: 2.9047375096556

¿No creo que pueda acortarlo? Todavía soy nuevo en el golf. Alguien hágamelo saber si pasé por alto algo.

Gracias Primo por salvarme 1 byte, jajaja.

jdstankosky
fuente
1
La final ($s-$c[2])se puede reemplazar $s-=$c[2]por un byte, pero eso es todo lo que puedo ver.
primo
@primo Gracias, hombre!
jdstankosky
1

JavaScript (84 86 )

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

Otra solución de JavaScript basada en la fórmula de Heron, pero que intenta un enfoque diferente para cargar variables. Debe ejecutarse desde la consola. Cada lado se ingresa en un mensaje separado.

EDITAR : utilice el valor de retorno de evalpara guardar 2 caracteres. Beats @tomsmeding, ¡wahoo! :)

mellamokb
fuente
1

Excel, 42 bytes

De acuerdo con la fórmula de Heron, álgebra de la escuela secundaria al 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
fuente
1

Japt , 17 16 15 bytes

½*Nx
NmnU ×*U q

Pruébalo

Ahorró 2 bytes gracias a que ETH señaló una nueva línea redundante y algunas formas alternativas de reducir la matriz.

Lanudo
fuente
Creo que se puede utilizar cualquiera de estos para la segunda línea, también: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions
1

Tcl, 74 caracteres.

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

Pase los lados como argumento.

Para la entrada, 2 3 4el valor de ses (2+3+4)/2.como cadena. Doble evaluación FTW.

Johannes Kuhn
fuente
Como proc, se extiende a solo 81 bytes: tio.run/##NYo7CoAwEAV7T/…
sergiol
1

Julia 0.6.0, 48 bytes

Básicamente la fórmula de la garza:

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

TI-BASIC, 14 12 bytes

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

Partiendo de una rutina de Fórmula de Heron escrita por Kenneth Hammond (Weregoose) , jugué dos bytes. Tenga en cuenta que TI-BASIC está tokenizado, y cada token, like Ansy prod(, es uno o dos bytes en la memoria de la calculadora.

Entrada a través de Ansie en el formulario {a,b,c}:[program name].

Explicado:

                   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
fuente
He convertido esto en una wiki comunitaria, ya que no es tu propio trabajo. Realmente no tenemos un consenso sólido sobre esto, pero siéntase libre de opinar aquí si no está de acuerdo con mi decisión.
Martin Ender
1

C (gcc) , 55 bytes

#define f(a,b,c)sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a))/4

Pruébalo en línea!

Otra implementación más de la fórmula del héroe.

techo
fuente
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
fuente
Hola, soy principiante de programación, si hay algún error, por favor, sugiéreme.
sharath 01 de
Bienvenido a CodeGolf. Primero debe verificar que el programa funciona y de alguna manera genera el resultado. Hay algunos errores simples en este.
ugoren
0

APL (NARS), 16 caracteres, 32 bytes

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

Uno tiene que centrar la fórmula de Erone si a, b, c son lados del triángulo

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

al lenguaje APL ... prueba

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