Área do triângulo Lado Lado Lado


17

Dado três lados de um triângulo, imprima a área desse triângulo.

Casos de teste:

Em: 2,3,4

Fora: 2.90473750965556

Em: 3,4,5

Fora: 6

Suponha que os três lados a, b, c sempre a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

Respostas:


6

J, 23 19 caracteres

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

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

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

Versão de 17 caracteres se a entrada estiver em i:4%~%:*/(+/,+/-+:)i

versão original de 23 caracteres: (%:@(+/**/@(+/-+:))%4:)


7

APL 21 20

Obtém a entrada da tela via ← ⎕

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

6

Python 2, 53

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

Entrada: 2,3,4

Resultado: 2.90473750966


3
Eu perdi muito tempo tentando encontrar uma solução melhor. Estou convencido de que esta é tão bom quanto ele ganha
jamylak

2
@jamylak você e eu os dois;)
primo

6

Mathematica 23

√Times@@(+##/2-{0,##})&

Apenas um comentário à parte. Nós (geralmente) tentamos fornecer código Mma como funções aqui. Por exemplo, no seu casoSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr. belisarius

2
28 caracteres, como uma função de (Tr@#Times@@(Tr@#-2#))^.5/4&, ou 27 utilizando uma variável
Dr. Belisarius

@belisarius Obrigado pela sua sugestão.
chyanog

5

Python 57 bytes

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

Usando a fórmula de Heron .

Uso da amostra:

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

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

Uma variante de 58 bytes:

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

Eu não estou muito familiarizado com python, mas por que a linha 2 está em *.5vez de /2?
Jdstankosky #

@jdstankosky O operador de divisão no Python é, por padrão, a divisão inteira, de modo que, se a soma de a+b+cfor ímpar, o resultado será incorreto. Isso mudou no Python 3, embora a maioria dos envios de golfe seja assumida como Python 2.7, a menos que seja especificado de outra forma (assim como os envios de Perl são considerados 5.10+ e não Perl 6).
Primo4

3
Você poderia apenas dizer "Python 3" em vez de "Python".
5603 Joe Z.

11
@JoeZ. Não. Este é o Python 2; no Python 3, input () retorna uma string, quebrando esta solução.
Khuldraeseth na'Barya

4

GolfScript, 38 caracteres

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

Como a pergunta não especificou o contrário, optei por trabalhar apenas em comprimentos inteiros. Os lados devem ser dados no STDIN separados por espaços.

Exemplo:

> 2 3 4
2.9047375096555625

3

K, 23

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

Exemplo

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

3

APL, 23 20 caracteres

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

Exemplo:

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

3

R: 48 43 caracteres

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

Usando a fórmula de Heron também, mas aproveitando a vetorização de R.
Obrigado a @flodel pela ideia das reticências.

Uso:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6

você pode soltar os colchetes. E você pode ganhar mais usando reticências: function(...)prod(sum(...)/2-c(0,...))^.5. Ou mesmo function(x)prod(sum(x)/2-c(0,x))^.5se você chamar sua função com um vetor.
flodel

@flodel thanks! Não pensei nas reticências, isso é legal.
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]))

Não é bom, mas divertido :) Também Heron ... Demonstra a imobilidade de problemas simples em JS lol

Nota : execute a partir do console para ver o resultado.

88-> 85: Removido a, be c.


11
Você pode economizar um pouco, dividindo apenas 2 uma vez. E você não ganha nada atribuindo a variáveis: (a=v[0])aé maior que v[0]v[0].
Peter Taylor

Se eu dividido por 2 apenas uma vez, como s=(v[0]+v[1]+v[2])/2com a, b, c = 3,4,5 resultaria em "345"/2=172.5" and not 6. Improved without um , B` e cembora.
tomsmeding

Ah, o maravilhoso sistema de tipos do JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2e mude o outro -para +. É um número par de termos, então cancela.
Peter Taylor

2

Mathematica 20 16 ou 22 18 bytes

Com 4 bytes salvos por @swish.

Isso retorna uma resposta exata:

Area@SSSTriangle@

Exemplo

Area@SSSTriangle[2,3,4]

imagem


Para retornar a resposta na forma decimal, são necessários dois bytes adicionais.

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

2,90474


Shaves composição par de bytesArea@*SSSTriangle
swish

Obrigado @swish, muito apreciado.
DavidC

1

Haskell: 51 (27) caracteres

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

Uma implementação muito direta da fórmula de Heron. Exemplo de execução:

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

Observe que ele aceita qualquer entrada numérica, não apenas números inteiros. E se a entrada já estiver em l, a solução precisará ter apenas 36 caracteres e, se não estivermos interessados ​​em imprimir a resposta, a solução precisará ter apenas 30 caracteres. O que mais é que, se nos permitirmos alterar o formato de entrada, podemos remover mais 3 caracteres. Portanto, se nossa entrada se parece com [2,3,4,0,0] e já está em l, podemos obter nossa resposta apenas:

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

Exemplo de execução:

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

Resultado: 2.9047375096556

Eu não acho que posso torná-lo mais curto? Eu ainda sou novo no golfe. Alguém me avise se eu esqueci alguma coisa.

Obrigado Primo por me salvar 1 byte, lol.


11
A final ($s-$c[2])pode ser substituída $s-=$c[2]por um byte, mas é tudo o que posso ver.
Primo #

@primo Obrigado, cara!
Jdstankosky

1

JavaScript (84 86 )

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

Outra solução JavaScript baseada na fórmula de Heron, mas tentando uma abordagem diferente para carregar variáveis. Precisa ser executado no console. Cada lado é inserido em um prompt separado.

EDIT : Utilize o valor de retorno de evalpara salvar 2 caracteres. Beats @tomsmeding, wahoo! :)


1

Excel, 42 bytes

Com base na fórmula de Heron, álgebra do ensino médio para o golfe.

=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

Japonês , 17 16 15 bytes

½*Nx
NmnU ×*U q

Teste-o

Economizou 2 bytes graças ao ETH apontando uma nova linha redundante e algumas maneiras alternativas de reduzir a matriz.


Eu acho que você pode usar qualquer um destes para a segunda linha, também: 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))}

Passe os lados como argumento.

Para a entrada, 2 3 4o valor de sé (2+3+4)/2.como string. Avaliação dupla FTW.


Como a proc, ele se estende a apenas 81 bytes: tio.run/##NYo7CoAwEAV7T/…
sergiol 16/17

1

Julia 0.6.0, 48 bytes

Basicamente a fórmula da garça-real:

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

A partir da rotina de Fórmula de Heron, escrita por Kenneth Hammond (Weregoose) , consegui dois bytes. Observe que o TI-BASIC é tokenizado e cada token, como Anseprod( , possui um ou dois bytes na memória da calculadora.

Entrada através, Ansou seja, no formulário {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))

Eu converti isso para um wiki da comunidade, pois não é seu próprio trabalho. Realmente não temos um consenso sólido sobre isso, mas fique à vontade para comentar aqui se você não concordar com a minha decisão.
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;
}

Oi iam iniciante de programação, se algum erro plz me sugerir.
sharath

Bem-vindo ao CodeGolf. Você deve primeiro verificar se o programa funciona e de alguma forma gera o resultado. Existem alguns erros simples neste.
Ugoren




0

APL (NARS), 16 caracteres, 32 bytes

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

É preciso converter a fórmula de Erone se a, b, c forem lados do triângulo

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

para a linguagem APL ... teste

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.