Khu vực tam giác Side Side Side


17

Cho ba cạnh của một tam giác, diện tích in của tam giác này.

Các trường hợp thử nghiệm:

Trong: 2,3,4

Hết: 2.90473750965556

Trong: 3,4,5

Hết: 6

Giả sử ba cạnh a, b, c luôn a> 0, b> 0, c> 0, a + b> c, b + c> a, c + a> b.

Câu trả lời:


6

J, 23 19 ký tự

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

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

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

Phiên bản 17-char nếu đầu vào ở i:4%~%:*/(+/,+/-+:)i

phiên bản 23-char gốc: (%:@(+/**/@(+/-+:))%4:)


7

APL 21 20

Đưa màn hình vào qua ←

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

6

Con trăn 2, 53

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

Đầu vào: 2,3,4

Đầu ra: 2.90473750966


3
Tôi đã lãng phí rất nhiều thời gian để cố gắng đưa ra một giải pháp tốt hơn. Tôi tin rằng điều này tốt như nó có được
jamylak

2
@jamylak cả bạn và tôi;)
primo

6

Toán học 23

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

Chỉ là một bình luận qua một bên. Chúng tôi (thường) cố gắng cung cấp mã Mma như các chức năng ở đây. Ví dụ trong trường hợp của bạnSqrt[Tr@#*Times@@(Tr@#-2#)]/4&
Tiến sĩ belisarius 27/03/13

2
28 ký tự, như một hàm (Tr@#Times@@(Tr@#-2#))^.5/4&, hoặc 27 bằng cách sử dụng một biến
Tiến sĩ belisarius

@ Belisarius Cảm ơn lời đề nghị của bạn.
chyanog

5

Python 57 byte

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

Sử dụng công thức của Heron .

Sử dụng mẫu:

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

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

Một biến thể 58 byte:

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

Tôi không quen thuộc lắm với python, nhưng tại sao dòng 2 *.5thay vì /2?
jdstankosky

@jdstankosky Toán tử phân chia trong Python theo phân chia số nguyên mặc định, do đó, nếu tổng của a+b+csố lẻ, kết quả sẽ bị sai. Điều này đã thay đổi trong Python 3, mặc dù hầu hết các bài nộp golf được coi là Python 2.7 trừ khi có quy định khác (giống như các bài nộp Perl được giả định là 5.10+, chứ không phải Perl 6).
primo

3
Bạn chỉ có thể nói "Python 3" thay vì "Python".
Joe Z.

1
@JoeZ. Không. Đây là Python 2; trong Python 3, input () trả về một chuỗi, phá vỡ giải pháp này.
Khuldraeseth na'Barya

4

GolfScript, 38 ký tự

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

Vì câu hỏi không chỉ định nếu không, tôi đã chọn chỉ làm việc trên độ dài số nguyên. Các mặt phải được đưa ra trên STDIN cách nhau bởi khoảng trắng.

Thí dụ:

> 2 3 4
2.9047375096555625

3

K, 23

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

Thí dụ

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

3

APL, 23 20 ký tự

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

Thí dụ:

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

3

R: 48 43 ký tự

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

Cũng sử dụng công thức của Heron nhưng tận dụng lợi thế của vector hóa R.
Cảm ơn @flodel cho ý tưởng về dấu chấm lửng.

Sử dụng:

f(2,3,4)
[1] 2.904738
f(3,4,5)
[1] 6

bạn có thể thả dấu ngoặc nhọn. Và bạn có thể đạt được nhiều hơn bằng cách sử dụng dấu chấm lửng : function(...)prod(sum(...)/2-c(0,...))^.5. Hoặc thậm chí function(x)prod(sum(x)/2-c(0,x))^.5nếu bạn gọi hàm của bạn bằng một vectơ.
flodel

@flodel cảm ơn! Tôi đã không nghĩ về dấu chấm lửng, thật tuyệt.
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]))

Không tốt nhưng vui vẻ :) Cũng là Heron ... Thể hiện sự vô dụng của các vấn đề đơn giản trong JS lol

Lưu ý : chạy từ bàn điều khiển để xem kết quả.

88-> 85: Removed a, bc.


1
Bạn có thể tiết kiệm một chút bằng cách chỉ chia cho 2 lần. Và bạn không thực sự đạt được bất cứ điều gì bằng cách gán cho các biến: (a=v[0])adài hơn v[0]v[0].
Peter Taylor

Nếu tôi chia cho 2 chỉ một lần, như s=(v[0]+v[1]+v[2])/2với a, b, c = 3,4,5 sẽ dẫn đến "345"/2=172.5" and not 6. Improved without một , b` và cmặc dù.
tomsmeding

Ah, hệ thống loại tuyệt vời của JavaScript. Ok, s=(-v[0]-v[1]-v[2])/2và thay đổi khác -để +. Đó là một số chẵn của các điều khoản, vì vậy nó hủy bỏ.
Peter Taylor

2

Toán học 20 16 hoặc 22 18 byte

Với 4 byte được lưu bởi @swish.

Điều này trả về một câu trả lời chính xác:

Area@SSSTriangle@

Thí dụ

Area@SSSTriangle[2,3,4]

hình ảnh


Để trả về câu trả lời ở dạng thập phân, cần có hai byte bổ sung.

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

2,90474


Thành phần cạo vài byteArea@*SSSTriangle
swish

@swish Cảm ơn, đánh giá cao.
DavidC

1

Haskell: 51 (27) ký tự

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

Việc thực hiện rất đơn giản công thức của Heron. Chạy ví dụ:

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

Lưu ý rằng nó chấp nhận bất kỳ đầu vào số nào, không chỉ số nguyên. Và nếu đầu vào đã có trong l, giải pháp chỉ cần dài 36 ký tự và nếu chúng ta không quan tâm đến việc in câu trả lời thì giải pháp chỉ cần dài 30 ký tự. Hơn nữa, nếu chúng ta có thể cho phép chính mình thay đổi định dạng đầu vào, chúng ta có thể xóa thêm 3 ký tự. Vì vậy, nếu đầu vào của chúng tôi trông giống như [2,3,4,0.0] và đã có trong l, chúng tôi chỉ có thể nhận được câu trả lời của mình:

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

Chạy ví dụ:

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

Sử dụng:

php triangle.php
2,3,4

Đầu ra: 2.9047375096556

Tôi không nghĩ rằng tôi có thể làm cho nó ngắn hơn? Tôi vẫn chưa quen với việc chơi golf. Bất cứ ai cho tôi biết nếu tôi bỏ qua một cái gì đó.

Cảm ơn Primo đã tiết kiệm cho tôi 1 byte, lol.


1
Trận chung kết ($s-$c[2])có thể được thay thế bằng $s-=$c[2]một byte, nhưng đó là tất cả những gì tôi có thể thấy.
primo

@primo Cảm ơn, anh bạn!
jdstankosky

1

JavaScript (84 86 )

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

Một giải pháp JavaScript khác dựa trên công thức của Heron, nhưng thử một cách tiếp cận khác để tải các biến. Cần phải được chạy từ bàn điều khiển. Mỗi bên được nhập vào một dấu nhắc riêng biệt.

EDIT : Sử dụng giá trị trả về của evalđể lưu 2 ký tự. Nhịp đập @tomsmeding, wahoo! :)


1

Excel, 42 byte

Dựa trên công thức của Heron, đại số trung học để chơi gôn.

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

Ungolfed / Unacheebra'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 byte

½*Nx
NmnU ×*U q

Kiểm tra nó

Đã lưu 2 byte nhờ ETH chỉ ra một dòng mới dư thừa và một số cách khác để giảm mảng.


Tôi nghĩ rằng bạn có thể sử dụng bất kỳ trong số này cho dòng thứ hai, quá: NmnU ×*U q, NmnU r*U q,Np0 mnU ×q
ETHproductions

1

Tcl, 74 ký tự.

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

Vượt qua các bên như tranh luận.

Đối với đầu vào 2 3 4, giá trị s(2+3+4)/2.dưới dạng chuỗi. Đánh giá kép FTW.


Như một proc, nó chỉ mở rộng tới 81 byte: tio.run/##NYo7CoAwEAV7T/ Kẻ
sergiol

1

Julia 0,6.0, 48 byte

Về cơ bản công thức của diệc:

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

1

TI-BASIC, 14 12 byte

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

Bắt đầu từ thói quen Công thức của Heron được viết bởi Kenneth Hammond (Weregoose) , tôi đã đánh gôn hai byte. Lưu ý rằng TI-BASIC được mã hóa và mỗi mã thông báo, như Ansprod(, là một hoặc hai byte trong bộ nhớ của máy tính.

Nhập thông qua Anstức là trong mẫu {a,b,c}:[program name].

Giải thích:

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

Tôi đã chuyển đổi nó thành wiki cộng đồng vì nó không phải là tác phẩm của riêng bạn. Chúng tôi thực sự không có sự đồng thuận vững chắc về vấn đề này, nhưng hãy thoải mái cân nhắc ở đây nếu bạn không đồng ý với quyết định của tôi.
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;
}

Xin chào người mới bắt đầu lập trình, nếu có lỗi xin vui lòng gợi ý cho tôi.
sharath

Chào mừng đến với CodeGolf. Trước tiên bạn nên xác minh rằng chương trình hoạt động và bằng cách nào đó đưa ra kết quả. Có một số lỗi đơn giản trong cái này.
ugoren




0

APL (NARS), 16 ký tự, 32 byte

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

Người ta phải chuyển công thức Erone nếu a, b, c là các cạnh của tam giác

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

sang ngôn ngữ APL ... kiểm tra

  f←{√×/(+/⍵÷2)-0,⍵}
  f 2 3 4
2.90473751
  f 3 4 5
6
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.