Ответы:
t=input()
s=a=sum(t)/2.
for x in t:a*=s-x
print a**.5
Входные данные: 2,3,4
Выход: 2.90473750966
Mathematica 23
√Times@@(+##/2-{0,##})&
Sqrt[Tr@#*Times@@(Tr@#-2#)]/4&
(Tr@#Times@@(Tr@#-2#))^.5/4&
, или 27 с использованием переменной
a,b,c=input()
s=(a+b+c)*.5
print(s*(s-a)*(s-b)*(s-c))**.5
С помощью формулу Герона .
Пример использования:
$ echo 2,3,4 | python triangle-area.py
2.90473750966
$ echo 3,4,5 | python triangle-area.py
6.0
58-байтовый вариант:
a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
*.5
вместо /2
?
a+b+c
нечетна, результат будет ошибочным. Это изменилось в Python 3, хотя предполагается, что большинство представлений о гольфе - это Python 2.7, если не указано иное (так же, как предполагается, что представления Perl 5.10+, а не Perl 6).
f=function(...)prod(sum(...)/2-c(0,...))^.5
Используя формулу Херона, но используя векторизацию R.
Спасибо @flodel за идею многоточия.
Использование:
f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
function(...)prod(sum(...)/2-c(0,...))^.5
. Или даже function(x)prod(sum(x)/2-c(0,x))^.5
если вы вызываете свою функцию с вектором.
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]))
Не хорошо, но весело :) Также цапля ... Демонстрирует неумелость простых проблем в JS LOL
Примечание : запустить из консоли, чтобы увидеть результат.
88-> 85: удалены a
, b
и c
.
(a=v[0])a
длиннее, чем v[0]v[0]
.
s=(v[0]+v[1]+v[2])/2
с a, b, c = 3,4,5, "345"/2=172.5" and not 6. Improved without
то ,
получился c
бы b` и хотя.
s=(-v[0]-v[1]-v[2])/2
и измените другой -
на +
. Это четное число терминов, поэтому оно отменяется.
С 4 байтами, сохраненными @swish.
Это возвращает точный ответ:
Area@SSSTriangle@
пример
Area@SSSTriangle[2,3,4]
Чтобы вернуть ответ в десятичной форме, требуется два дополнительных байта.
N@Area@SSSTriangle[2,3,4]
2,90474
Area@*SSSTriangle
readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)
Очень простая реализация формулы Герона. Пример выполнения:
Prelude> readLn>>=(\l->print$sqrt$product$map(sum l/2-)$0:l)
[2,3,4]
2.9047375096555625
Prelude>
Обратите внимание, что он принимает любые числовые данные, а не только целые числа. И если ввод уже в l, решение должно быть длиной всего 36 символов, и если мы не заинтересованы в распечатке ответа, решение должно быть длиной всего 30 символов. Более того, если мы можем позволить себе изменить формат ввода, мы можем удалить еще 3 символа. Так что если наш ввод выглядит как [2,3,4,0.0] и уже находится в l, мы можем получить наш ответ только с:
sqrt$product$map(sum l/2-)l
Пример выполнения:
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]);
Useage:
php triangle.php
2,3,4
Выход: 2.9047375096556
Я не думаю, что могу сделать это короче? Я все еще новичок в гольф. Кто-нибудь, дайте мне знать, если я что-то упустил.
Спасибо Primo за спасение мне 1 байт, смеется.
($s-$c[2])
можно заменить $s-=$c[2]
на один байт, но это все, что я вижу.
s=(eval('abc '.split('').join('=prompt()|0;'))+a+b)/2;Math.sqrt(s*(s-a)*(s-b)*(s-c))
Другое решение JavaScript, основанное на формуле Херона, но использующее другой подход для загрузки переменных. Необходимо запустить из консоли. Каждая сторона вводится в отдельном приглашении.
РЕДАКТИРОВАТЬ : Используйте возвращаемое значение, eval
чтобы сохранить 2 символа. Бьет @ tomsmeding, вау! :)
½*Nx
NmnU ×*U q
Сохранено 2 байта благодаря ETH, указывающему на избыточную новую строку и некоторые альтернативные способы уменьшения массива.
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))}
Передайте стороны в качестве аргумента.
Для ввода 2 3 4
значение s
является в (2+3+4)/2.
виде строки. Двойная оценка FTW.
4⁻¹√(sum(Ansprod(sum(Ans)-2Ans
Начиная с процедуры Формулы Герона, написанной Кеннетом Хаммондом (Weregoose) , я забил два байта. Обратите внимание, что TI-BASIC является токеном, и каждый токен, как Ans
и prod(
, занимает один или два байта в памяти калькулятора.
Ввод через Ans
т.е. в виде{a,b,c}:[program name]
.
Разъяснение:
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
Еще одна реализация формулы Героя.
#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;
}