Area Segitiga Sisi Sisi Samping

17

Diberikan tiga sisi segitiga, cetak area segitiga ini.

Kasus uji:

Dalam: 2,3,4

Keluar: 2.90473750965556

Dalam: 3,4,5

Keluar: 6

Asumsikan tiga sisi a, b, c selalu a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

chyanog
sumber

Jawaban:

6

J, 23 19 karakter

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

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

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

Versi 17-char jika input ada di i:4%~%:*/(+/,+/-+:)i

versi 23-char asli: (%:@(+/**/@(+/-+:))%4:)

randomra
sumber
7

APL 21 20

Mengambil input layar melalui ← ⎕

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

Python 2, 53

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

Memasukkan: 2,3,4

Keluaran: 2.90473750966

gempa bumi
sumber
3
Saya menghabiskan banyak waktu untuk mencari solusi yang lebih baik. Saya yakin ini sebagus yang didapat
jamylak
2
@jamylak Anda dan saya berdua;)
primo
6

Mathematica 23

√Times@@(+##/2-{0,##})&
chyanog
sumber
Hanya komentar samping. Kami (biasanya) mencoba memberikan kode Mma sebagai fungsi di sini. Sebagai contoh dalam kasus AndaSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Dr. belisarius
2
28 karakter, sebagai fungsi (Tr@#Times@@(Tr@#-2#))^.5/4&, atau 27 menggunakan variabel
Dr. belisarius
@belisarius Terima kasih atas saran Anda.
chyanog
5

Python 57 byte

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

Menggunakan Formula Heron .

Penggunaan sampel:

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

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

Varian 58 byte:

a,b,c=input()
print((a+b+c)*(b+c-a)*(a+c-b)*(a+b-c))**.5/4
primo
sumber
Saya tidak terlalu terbiasa dengan python, tetapi mengapa baris 2 *.5bukan /2?
jdstankosky
@ jdstankosky Operator divisi di Python secara default adalah integer division, sehingga jika jumlah a+b+cganjil, hasilnya akan salah. Ini memang berubah dalam Python 3, meskipun sebagian besar pengiriman golf diasumsikan Python 2.7 kecuali ditentukan lain (seperti pengiriman Perl diasumsikan 5.10+, dan bukan Perl 6).
Primo
3
Anda bisa mengatakan "Python 3" bukannya "Python".
Joe Z.
1
@ Joz. Nggak. Ini adalah Python 2; di Python 3, input () mengembalikan sebuah string, memecah solusi ini.
Khuldraeseth na'Barya
4

GolfScript, 38 karakter

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

Karena pertanyaan tidak menentukan sebaliknya saya memilih untuk bekerja hanya pada panjang integer. Sisi harus diberikan pada STDIN yang dipisahkan oleh spasi.

Contoh:

> 2 3 4
2.9047375096555625
Howard
sumber
3

K, 23

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

Contoh

k){sqrt s**/(s:.5*+/x)-x} 2 3 4
2.904738
tmartin
sumber
3

APL, 23 20 karakter

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

Contoh:

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

R: 48 43 karakter

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

Menggunakan rumus Heron juga tetapi memanfaatkan vektorisasi R.
Terima kasih kepada @flodel untuk ide elipsis.

Pemakaian:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6
plannapus
sumber
Anda bisa menjatuhkan kurung keriting. Dan Anda bisa mendapatkan lebih dengan menggunakan elipsis: function(...)prod(sum(...)/2-c(0,...))^.5. Atau bahkan function(x)prod(sum(x)/2-c(0,x))^.5jika Anda memanggil fungsi Anda dengan vektor.
flodel
@ model terima kasih! Saya tidak memikirkan ellipsis, itu bagus.
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]))

Tidak bagus tapi menyenangkan :) Bangau juga ... Menunjukkan ketidaklayakan masalah sederhana di JS lol

Catatan : jalankan dari konsol untuk melihat hasilnya.

88-> 85: Dihapus a, bdan c.

tommeding
sumber
1
Anda dapat menyimpan sedikit dengan hanya membagi 2 sekali. Dan Anda tidak benar-benar mendapatkan apa pun dengan menugaskan ke variabel: (a=v[0])alebih lama dari v[0]v[0].
Peter Taylor
Jika saya dibagi 2 hanya satu kali, seperti s=(v[0]+v[1]+v[2])/2dengan a, b, c = 3,4,5 akan menghasilkan "345"/2=172.5" and not 6. Improved without sebuah , b` dan csekalipun.
tommeding
Ah, sistem tipe JavaScript yang luar biasa. Ok, s=(-v[0]-v[1]-v[2])/2dan mengubah lainnya -untuk +. Ini adalah angka yang genap, jadi dibatalkan.
Peter Taylor
2

Mathematica 20 16 atau 22 18 bytes

Dengan 4 byte disimpan oleh @swish.

Ini mengembalikan jawaban yang tepat:

Area@SSSTriangle@

Contoh

Area@SSSTriangle[2,3,4]

gambar


Untuk mengembalikan jawaban dalam bentuk desimal, diperlukan dua byte tambahan.

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

2.90474

DavidC
sumber
Komposisi mencukur beberapa byteArea@*SSSTriangle
desak
@berharap Terima kasih, Sangat dihargai.
DavidC
1

Haskell: 51 (27) karakter

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

Implementasi formula Heron yang sangat mudah. Contoh dijalankan:

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

Perhatikan bahwa ia menerima input numerik apa pun, tidak hanya bilangan bulat. Dan jika input sudah ada dalam l solusinya hanya perlu 36 karakter, dan jika kita tidak tertarik untuk mencetak jawaban, solusinya hanya perlu 30 karakter. Apa lagi itu jika kita bisa membiarkan diri kita untuk mengubah format input kita dapat menghapus 3 karakter lagi. Jadi jika input kita seperti [2,3,4,0.0] dan sudah ada di l kita hanya bisa mendapatkan jawaban kita:

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

Contoh dijalankan:

Prelude> let l = [2,3,4,0.0]
Prelude> sqrt$product$map(sum l/2-)l
2.9047375096555625
Prelude>
Untuk S
sumber
1

PHP, 78 77

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

Penggunaan:

php triangle.php
2,3,4

Keluaran: 2.9047375096556

Saya tidak berpikir saya bisa membuatnya lebih pendek? Saya masih baru bermain golf. Siapa pun beri tahu saya jika saya mengabaikan sesuatu.

Terima kasih Primo karena telah menyelamatkan saya 1 byte, lol.

jdstankosky
sumber
1
Final ($s-$c[2])dapat diganti dengan $s-=$c[2]satu byte, tapi hanya itu yang bisa saya lihat.
primo
@rimo Terima kasih, teman!
jdstankosky
1

JavaScript (84 86 )

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

Solusi JavaScript lain berdasarkan pada rumus Heron, tetapi mencoba pendekatan yang berbeda untuk memuat variabel. Perlu dijalankan dari konsol. Setiap sisi dimasukkan dalam prompt terpisah.

EDIT : Manfaatkan nilai balik evaluntuk menyimpan 2 karakter. Beats @tomsmeding, wahoo! :)

mellamokb
sumber
1

Excel, 42 byte

Berdasarkan rumus Heron, aljabar sekolah menengah hingga golf.

=SQRT(((A1+B1)^2-C1^2)*(C1^2-(A1-B1)^2))/4

Tidak disatukan / Tidak disatukan

=SQRT((A1+B1+C1)/2*(((A1+B1+C1)/2)-A1)*(((A1+B1+C1)/2)-B1)*(((A1+B1+C1)/2)-C1))
Wernisch
sumber
1

Japt , 17 16 15 byte

½*Nx
NmnU ×*U q

Menguji

Disimpan 2 byte berkat ETH menunjukkan garis baru yang berlebihan dan beberapa cara alternatif untuk mengurangi array.

Shaggy
sumber
Saya pikir Anda dapat menggunakan ini untuk baris kedua, terlalu: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions
1

Tcl, 74 karakter.

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

Lewati sisi sebagai argumen.

Untuk input 2 3 4nilai sadalah (2+3+4)/2.sebagai string. Evaluasi ganda FTW.

Johannes Kuhn
sumber
Sebagai proc, hanya meluas hingga 81 byte: tio.run/##NYo7CoAwEAV7T/…
sergiol
1

Julia 0.6.0, 48 bytes

Pada dasarnya rumus bangau:

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

TI-BASIC, 14 12 byte

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

Mulai dari rutinitas Formula Heron yang ditulis oleh Kenneth Hammond (Weregoose) , saya bermain golf dua byte. Perhatikan bahwa TI-BASIC adalah tokenized, dan setiap token, seperti Ansdanprod( , adalah satu atau dua byte dalam memori kalkulator.

Masukan melalui Ansyaitu dalam formulir {a,b,c}:[program name].

Dijelaskan:

                   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
sumber
Saya telah mengonversikan ini ke wiki komunitas karena ini bukan karya Anda sendiri. Kami tidak benar-benar memiliki konsensus yang kuat tentang ini, tetapi jangan ragu untuk menimbang di sini jika Anda tidak setuju dengan keputusan saya.
Martin Ender
1

dc , 34 byte

9ksssddlsld++2/d3R-rdls-rdld-***vp

Cobalah online!

jnfnt
sumber
1

C (gcc) , 55 byte

#define f(a,b,c)sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a))/4

Cobalah online!

Namun implementasi lain dari formula Pahlawan.

plafon
sumber
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;
}
Sharar
sumber
Hai saya pemula pemrograman, jika ada kesalahan tanyakan saya.
Sharar
Selamat datang di CodeGolf. Anda harus terlebih dahulu memverifikasi bahwa program itu bekerja dan entah bagaimana mengeluarkan hasilnya. Ada beberapa bug sederhana yang satu ini.
ugoren
0

APL (NARS), 16 karakter, 32 byte

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

Kita harus cenvert rumus Erone jika a, b, c adalah sisi segitiga

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

ke bahasa APL ... tes

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
RosLuP
sumber