Площадь треугольника Сторона Сторона Сторона


17

Учитывая три стороны треугольника, напечатайте область этого треугольника.

Тестовые случаи:

В: 2,3,4

Out: 2.90473750965556

В: 3,4,5

Out: 6

Предположим, что три стороны a, b, c всегда a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

Ответы:


6

J, 23 19 символов

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

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

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

17-символьная версия, если вход находится в i:4%~%:*/(+/,+/-+:)i

оригинальная версия с 23 символами: (%:@(+/**/@(+/-+:))%4:)



6

Python 2, 53

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

Входные данные: 2,3,4

Выход: 2.90473750966


3
Я потратил много времени, пытаясь найти лучшее решение. Я убежден, что это так же хорошо, как это получается
jamylak

2
@jamylak вы и я оба;)
primo

6

Mathematica 23

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

Просто сторонний комментарий. Мы (обычно) пытаемся предоставить код Mma в качестве функций здесь. Например, в вашем случаеSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
д-р Велизарий

2
28 символов, как функция (Tr@#Times@@(Tr@#-2#))^.5/4&, или 27 с использованием переменной
Dr. belisarius

@belisarius Спасибо за ваше предложение.
Chyanog

5

Python 57 байт

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

Я не очень хорошо знаком с Python, но почему строка 2 *.5вместо /2?
jdstankosky

@jdstankosky Оператор деления в Python по умолчанию является целочисленным делением, поэтому, если сумма a+b+cнечетна, результат будет ошибочным. Это изменилось в Python 3, хотя предполагается, что большинство представлений о гольфе - это Python 2.7, если не указано иное (так же, как предполагается, что представления Perl 5.10+, а не Perl 6).
Примо

3
Вы можете просто сказать «Python 3» вместо «Python».
Джо З.

1
@JoeZ. Нет. Это Python 2; в Python 3 input () возвращает строку, нарушая это решение.
Хулдраесет на'Барья

4

GolfScript, 38 символов

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

Поскольку в вопросе не указано иное, я решил работать только с целыми длинами. Стороны должны быть указаны на STDIN через пробел.

Пример:

> 2 3 4
2.9047375096555625


3

APL, 23 20 символов

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

Пример:

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

3

R: 48 43 символа

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если вы вызываете свою функцию с вектором.
Flodel

@ Флодель спасибо! Я не думал об эллипсисе, это мило.
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]))

Не хорошо, но весело :) Также цапля ... Демонстрирует неумелость простых проблем в JS LOL

Примечание : запустить из консоли, чтобы увидеть результат.

88-> 85: удалены a, bи c.


1
Вы можете сэкономить немного, только разделив на 2 один раз. И вы на самом деле ничего не получаете, присваивая переменным: (a=v[0])aдлиннее, чем v[0]v[0].
Питер Тейлор

Если бы я разделил на 2 только один раз, как 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` и хотя.
Томсминг

Ах, замечательная система типов JavaScript. Хорошо, s=(-v[0]-v[1]-v[2])/2и измените другой -на +. Это четное число терминов, поэтому оно отменяется.
Питер Тейлор

2

Mathematica 20 16 или 22 18 байт

С 4 байтами, сохраненными @swish.

Это возвращает точный ответ:

Area@SSSTriangle@

пример

Area@SSSTriangle[2,3,4]

образ


Чтобы вернуть ответ в десятичной форме, требуется два дополнительных байта.

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

2,90474


Композиция бреет пару байтовArea@*SSSTriangle
свист

@swish Спасибо, высоко ценится.
DavidC

1

Хаскель: 51 (27) символов

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>

1

PHP 78 77

<?=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 байт, смеется.


1
Финал ($s-$c[2])можно заменить $s-=$c[2]на один байт, но это все, что я вижу.
Прим

@primo Спасибо, чувак!
jdstankosky

1

JavaScript (84 86 )

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

Другое решение JavaScript, основанное на формуле Херона, но использующее другой подход для загрузки переменных. Необходимо запустить из консоли. Каждая сторона вводится в отдельном приглашении.

РЕДАКТИРОВАТЬ : Используйте возвращаемое значение, evalчтобы сохранить 2 символа. Бьет @ tomsmeding, вау! :)


1

Excel, 42 байта

На основе формулы Герона, алгебра средней школы в гольф.

=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 байт

½*Nx
NmnU ×*U q

Проверь это

Сохранено 2 байта благодаря ETH, указывающему на избыточную новую строку и некоторые альтернативные способы уменьшения массива.


Я думаю , что вы можете использовать любой из них на второй линии, тоже: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions

1

Tcl, 74 символа.

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.


Как правилоproc , он расширяется до 81 байта: tio.run/##NYo7CoAwEAV7T/…
sergiol

1

Юлия 0.6.0, 48 байтов

В основном формула цапли:

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

1

TI-BASIC, 14 12 байтов

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

Я преобразовал это в вики сообщества, так как это не твоя собственная работа. У нас нет единого мнения по этому поводу , но не стесняйтесь взвешивать здесь, если вы не согласны с моим решением.
Мартин Эндер



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

Привет я начинающий программирование, если какие-либо ошибки, пожалуйста, предложите мне.
Шарат

Добро пожаловать в CodeGolf. Сначала вы должны убедиться, что программа работает и каким-то образом выводит результат. В этом есть несколько простых ошибок.
Угорен




0

APL (NARS), 16 символов, 32 байта

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

Нужно центрировать формулу Эроне, если a, b, c - стороны треугольника

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

на язык APL ... тест

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.