Bok trójkąta Bok boku

17

Biorąc pod uwagę trzy boki trójkąta, wydrukuj obszar tego trójkąta.

Przypadki testowe:

W: 2,3,4

Out: 2.90473750965556

W: 3,4,5

Out: 6

Załóżmy, że trzy strony a, b, c zawsze a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

chyanog
źródło

Odpowiedzi:

6

J, 23 19 znaków

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

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

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

Wersja 17-znakowa, jeśli wejście jest w i:4%~%:*/(+/,+/-+:)i

oryginalna wersja 23-znakowa: (%:@(+/**/@(+/-+:))%4:)

randomra
źródło
7

APL 21 20

Odbiera dane z ekranu za pomocą ← ⎕

(×/(+/t÷2)-0,t←⎕)*.5
Graham
źródło
6

Python 2, 53

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

Wejście: 2,3,4

Wynik: 2.90473750966

trzęsienie ziemi
źródło
3
Zmarnowałem dużo czasu, próbując znaleźć lepsze rozwiązanie. Jestem przekonany, że to jest tak dobre, jak to możliwe
jamylak
2
@jamylak ty i ja oboje;)
primo
6

Mathematica 23

√Times@@(+##/2-{0,##})&
chyanog
źródło
Tylko komentarz na bok. (Zwykle) próbujemy podać kod Mma jako funkcje tutaj. Na przykład w twoim przypadkuSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
dr belisarius
2
28 znaków, jako funkcja (Tr@#Times@@(Tr@#-2#))^.5/4&, lub 27 przy użyciu zmiennej
Dr. belisarius
@belisarius Dzięki za sugestię.
chyanog
5

Python 57 bajtów

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

Korzystanie z formuły Herona .

Przykładowe użycie:

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

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

58-bajtowy wariant:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
primo
źródło
Nie znam się na Pythonie, ale dlaczego *.5zamiast drugiej linii /2?
jdstankosky
@jdstankosky Operatorem podziału w Pythonie jest domyślnie podział na liczby całkowite, więc jeśli suma a+b+cjest nieparzysta, wynik będzie błędny. Zmieniło się to w Pythonie 3, chociaż zakłada się, że większość zgłoszeń do golfa to Python 2.7, chyba że określono inaczej (tak jak przyjmuje się, że zgłoszenia w Perlu to 5.10+, a nie w Perl 6).
primo
3
Ty mógł po prostu powiedzieć „Python 3” zamiast „Python”.
Joe Z.
1
@JoeZ. Nie. To jest Python 2; w Pythonie 3 funkcja input () zwraca ciąg znaków, przerywając to rozwiązanie.
Khuldraeseth na'Barya
4

GolfScript, 38 znaków

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

Ponieważ pytanie nie określiło inaczej, zdecydowałem się pracować tylko na długościach całkowitych. Strony muszą być podane na STDIN oddzielone spacjami.

Przykład:

> 2 3 4
2.9047375096555625
Howard
źródło
3

K, 23

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

Przykład

k){sqrt s**/(s:.5*+/x)-x} 2 3 4
2.904738
tartin
źródło
3

APL, 23 20 znaków

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

Przykład:

> {(×/(+/⍵÷2)-0,⍵)*÷2} 2 3 4
2.90474
Howard
źródło
3

R: 48 43 znaków

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

Korzystając również ze wzoru Herona, ale korzystając z wektoryzacji R.
Dzięki @flodel za pomysł na elipsę.

Stosowanie:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
plannapus
źródło
możesz upuścić nawiasy klamrowe. A możesz zyskać więcej za pomocą wielokropka: function(...)prod(sum(...)/2-c(0,...))^.5. Lub nawet function(x)prod(sum(x)/2-c(0,x))^.5jeśli wywołasz swoją funkcję za pomocą wektora.
flodel
@flodel dzięki! Nie myślałem o elipsie, to miło.
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]))

Nie dobrze, ale fajnie :) Również Czapla ... Demonstruje niemożność rozwiązywania prostych problemów w JS lol

Uwaga : uruchom z konsoli, aby zobaczyć wynik.

88-> 85: Usunięty a, bi c.

Tomsmeding
źródło
1
Możesz trochę zaoszczędzić, dzieląc tylko 2 raz. I tak naprawdę nic nie zyskujesz, przypisując zmienne: (a=v[0])ajest dłuższy niż v[0]v[0].
Peter Taylor
Jeśli że dzieli się przez 2, tylko jeden raz, na przykład s=(v[0]+v[1]+v[2])/2z a, b, c = 3,4,5 doprowadziłoby "345"/2=172.5" and not 6. Improved without do , B` i cchociaż.
tomsmeding
Ach, cudowny system pisma JavaScript. Ok s=(-v[0]-v[1]-v[2])/2i zmień drugą -na +. Jest to parzysta liczba warunków, więc anuluje się.
Peter Taylor
2

Mathematica 20 16 lub 22 18 bajtów

Z 4 bajtami zapisanymi przez @swish.

To zwraca dokładną odpowiedź:

Area@SSSTriangle@

Przykład

Area@SSSTriangle[2,3,4]

image


Aby zwrócić odpowiedź w postaci dziesiętnej, wymagane są dwa dodatkowe bajty.

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

2,90474

DavidC
źródło
Kompozycja goli kilka bajtówArea@*SSSTriangle
świst
@ Swish Dzięki, bardzo mile widziane.
DavidC
1

Haskell: 51 (27) znaków

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

Bardzo prosta implementacja formuły Herona. Przykładowy przebieg:

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

Zauważ, że akceptuje dowolne dane liczbowe, nie tylko liczby całkowite. A jeśli dane wejściowe są już w l, rozwiązanie musi mieć tylko 36 znaków, a jeśli nie jesteśmy zainteresowani wydrukowaniem odpowiedzi, rozwiązanie musi mieć tylko 30 znaków. Co więcej, jeśli możemy pozwolić sobie na zmianę formatu wejściowego, możemy usunąć jeszcze 3 znaki. Więc jeśli nasze dane wejściowe wyglądają na [2,3,4,0,0] i są już w l, możemy uzyskać odpowiedź tylko:

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

Przykładowy przebieg:

Prelude> let l = [2,3,4,0.0]
Prelude> sqrt$product$map(sum l/2-)l
2.9047375096555625
Prelude>
Fors
źródło
1

PHP, 78 77

<?=sqrt(($s=array_sum($c=fgetcsv(STDIN))/2)*($s-$c[0])*($s-$c[1])*$s-=$c[2]);

Wykorzystanie:

php triangle.php
2,3,4

Wynik: 2.9047375096556

Nie sądzę, że mogę to skrócić? Nadal jestem nowy w golfa. Daj mi znać, jeśli coś przeoczyłem.

Dzięki Primo za uratowanie mnie 1 bajt, lol.

jdstankosky
źródło
1
Finał ($s-$c[2])można zastąpić $s-=$c[2]jednym bajtem, ale to wszystko, co widzę.
primo
@primo Dzięki, stary!
jdstankosky
1

JavaScript (84 86 )

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

Inne rozwiązanie JavaScript oparte na formule Herona, ale próbujące innego podejścia do ładowania zmiennych. Musi być uruchamiany z konsoli. Każda strona jest wprowadzana w osobnym monicie.

EDYCJA : Użyj wartości zwracanej, evalaby zapisać 2 znaki. Beats @tomsmeding, wahoo! :)

mellamokb
źródło
1

Excel, 42 bajty

Oparty na formule Herona, algebry szkolnej do golfa.

=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))
Wernisch
źródło
1

Japt , 17 16 15 bajtów

½*Nx
NmnU ×*U q

Sprawdź to

Zaoszczędzono 2 bajty dzięki ETH wskazującemu nadmiarową nową linię i kilka alternatywnych sposobów na zmniejszenie tablicy.

Kudłaty
źródło
Myślę, że można użyć dowolnego z nich do drugiej linii, za: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions
1

Tcl, 74 znaki.

proc R {a b c} {set s ($a+$b+$c)/2.
expr sqrt($s*($s-$a)*($s-$b)*($s-$c))}

Podaj boki jako argument.

Dla danych wejściowych 2 3 4wartością sjest (2+3+4)/2.ciąg znaków. Podwójna ocena FTW.

Johannes Kuhn
źródło
Jako a proc, zajmuje
sergiol
1

Julia 0.6.0, 48 bajtów

Zasadniczo formuła czapli:

f(a,b,c)=(p=(a+b+c)/2;sqrt(p*(p-a)*(p-b)*(p-c)))
Goysa
źródło
1

TI-BASIC, 14 12 bajtów

4⁻¹√(sum(Ansprod(sum(Ans)-2Ans

Zaczynając od rutynowej formuły Herona napisanej przez Kennetha Hammonda (Weregoose) , grałem w golfa o dwa bajty. Zauważ, że TI-BASIC jest tokenizowany, a każdy token, jak Ansiprod( , ma jeden lub dwa bajty w pamięci kalkulatora.

Dane wejściowe Ansnp. W formularzu {a,b,c}:[program name].

Wyjaśniono:

                   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))
lirtosiast
źródło
Przekształciłem to w wiki społeczności, ponieważ nie jest to twoja własna praca. Tak naprawdę nie mamy solidnego konsensusu w tej sprawie, ale możesz się tutaj zastanowić , jeśli nie zgadzasz się z moją decyzją.
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;
}
sharath
źródło
Cześć, jestem początkującym programistą, jeśli jakieś błędy sugerują, proszę.
sharath,
Witamy w CodeGolf. Najpierw powinieneś sprawdzić, czy program działa i jakoś wypisuje wynik. W tym jest kilka prostych błędów.
ugoren,
0

APL (NARS), 16 znaków, 32 bajty

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

Trzeba przekształcić wzór Erone, jeśli a, b, c są bokami trójkąta

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

na język APL ... test

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
RosLuP
źródło