Сторона трикутника Бічна сторона


17

Дано три сторони трикутника, область друку цього трикутника.

Тестові приклади:

В: 2,3,4

Вихід: 2,90473750965556

В: 3,4,5

Вихід: 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:)


7

21 ЛІП 20

Здійснює введення екрана через ← ⎕

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

6

Пітон 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

Математика 23

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

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

2
28 знаків, як функція (Tr@#Times@@(Tr@#-2#))^.5/4&, або 27 за допомогою змінної
доктор belisarius

@belisarius Дякуємо за вашу пропозицію.
чіяно

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 () повертає рядок, порушуючи це рішення.
Khuldraeseth na'Barya

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 дякую! Я не думав про еліпсис, це приємно.
планнапус

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])/2a, b, c = 3,4,5, це призведе "345"/2=172.5" and not 6. Improved without до , b` і cхоча.
tomsmeding

Ах, прекрасна система типу JavaScript. Добре, s=(-v[0]-v[1]-v[2])/2а інший змініть -на +. Це парна кількість термінів, тому вона скасовується.
Пітер Тейлор

2

Mathematica 20 16 або 22 18 байт

З 4 байтами, збереженими @swish.

Це повертає точну відповідь:

Area@SSSTriangle@

Приклад

Area@SSSTriangle[2,3,4]

image


Щоб повернути відповідь у десятковій формі, потрібні два додаткові байти.

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

2.90474


Склад голить пару байтArea@*SSSTriangle
помах

@swish Дякую, багато вдячний.
DavidC

1

Haskell: 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]);

Використання:

php triangle.php
2,3,4

Вихід: 2.9047375096556

Я не думаю, що я можу скоротити її? Я все ще новачок у гольфі. Хто-небудь дасть мені знати, якщо я щось пропустив.

Дякую Примо, що врятував мене 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, засноване на формулі Герона, але намагається інший підхід для завантаження змінних. Потрібно запустити з консолі. Кожна сторона вводиться в окремому підказці.

EDIT : Використовуйте повернене значення, evalщоб зберегти 2 символи. Удари @tomsmeding, wahoo! :)


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

Привіт, я початківець програмування, якщо будь-які помилки PLZ мені підказують.
Шарат

Ласкаво просимо до 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.