Á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.

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:)


7

APL 21 20

Toma entrada de pantalla a través de ← ⎕

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

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


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,##})&

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

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

3

K, 23

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

Ejemplo

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

3

APL, 23 20 caracteres

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

Ejemplo:

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

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

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.


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


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>

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.


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! :)


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))

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.


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.


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)))

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))

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



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;
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.