Respostas:
t=input()
s=a=sum(t)/2.
for x in t:a*=s-x
print a**.5
Entrada: 2,3,4
Resultado: 2.90473750966
Mathematica 23
√Times@@(+##/2-{0,##})&
Sqrt[Tr@#*Times@@(Tr@#-2#)]/4&
(Tr@#Times@@(Tr@#-2#))^.5/4&
, ou 27 utilizando uma variável
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
*.5
vez de /2
?
a+b+c
for í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).
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
function(...)prod(sum(...)/2-c(0,...))^.5
. Ou mesmo function(x)prod(sum(x)/2-c(0,x))^.5
se você chamar sua função com um vetor.
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
, b
e c
.
(a=v[0])a
é maior que v[0]v[0]
.
s=(v[0]+v[1]+v[2])/2
com a, b, c = 3,4,5 resultaria em "345"/2=172.5" and not 6. Improved without
um ,
B` e c
embora.
s=(-v[0]-v[1]-v[2])/2
e mude o outro -
para +
. É um número par de termos, então cancela.
Com 4 bytes salvos por @swish.
Isso retorna uma resposta exata:
Area@SSSTriangle@
Exemplo
Area@SSSTriangle[2,3,4]
Para retornar a resposta na forma decimal, são necessários dois bytes adicionais.
N@Area@SSSTriangle[2,3,4]
2,90474
Area@*SSSTriangle
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>
<?=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.
($s-$c[2])
pode ser substituída $s-=$c[2]
por um byte, mas é tudo o que posso ver.
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 eval
para salvar 2 caracteres. Beats @tomsmeding, wahoo! :)
½*Nx
NmnU ×*U q
Economizou 2 bytes graças ao ETH apontando uma nova linha redundante e algumas maneiras alternativas de reduzir a matriz.
NmnU ×*U q
, NmnU r*U q
,Np0 mnU ×q
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 4
o valor de s
é (2+3+4)/2.
como string. Avaliação dupla FTW.
proc
, ele se estende a apenas 81 bytes: tio.run/##NYo7CoAwEAV7T/…
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 Ans
eprod(
, possui um ou dois bytes na memória da calculadora.
Entrada através, Ans
ou 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))
#define f(a,b,c)sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a))/4
Mais uma implementação da fórmula do Herói.
#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;
}