พื้นที่สามเหลี่ยมด้านข้างด้านข้าง


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-char ดั้งเดิม: (%:@(+/**/@(+/-+:))%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 ใช้ตัวแปร
ดร. เบลิซา

@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

ฉันไม่ชะมัดคุ้นเคยกับงูหลาม แต่ทำไมเป็นสาย 2 *.5แทน/2?
jdstankosky

@jdstankosky ตัวดำเนินการหารใน Python คือการหารจำนวนเต็มเริ่มต้นดังนั้นหากผลรวมของa+b+cเป็นเลขคี่ผลลัพธ์จะผิดพลาด สิ่งนี้เปลี่ยนแปลงใน Python 3 แม้ว่าการส่งกอล์ฟส่วนใหญ่จะถือว่าเป็น Python 2.7 เว้นแต่จะระบุไว้เป็นอย่างอื่น (เช่นเดียวกับการส่ง Perl จะถือว่าเป็น 5.10+ และไม่ใช่ Perl 6)
primo

3
คุณสามารถพูดว่า "Python 3" แทน "Python"
Joe Z.

1
@JoeZ Nope นี่คือ Python 2; ใน Python 3 input () จะส่งคืนสตริงซึ่งเป็นการแก้ปัญหานี้
Khuldraeseth na'Barya

4

GolfScript, 38 ตัวอักษร

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

เนื่องจากคำถามไม่ได้ระบุเป็นอย่างอื่นฉันเลือกที่จะทำงานเฉพาะกับความยาวจำนวนเต็มเท่านั้น ต้องให้ด้านกับ STDIN คั่นด้วยช่องว่าง

ตัวอย่าง:

> 2 3 4
2.9047375096555625



3

R: 48 43 ตัวอักษร

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

ใช้สูตรของนกกระสา แต่ใช้ประโยชน์จาก vectorization ของ 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

@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, และbc


1
คุณสามารถบันทึกได้เพียงเล็กน้อยโดยหารด้วย 2 เพียงครั้งเดียว และคุณไม่ได้อะไรจริงโดยการกำหนดตัวแปร: มีความยาวกว่า(a=v[0])a v[0]v[0]
Peter Taylor

หากฉันหารด้วย 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และการเปลี่ยนแปลงอื่น ๆที่จะ- +มันเป็นจำนวนเทอมดังนั้นมันจึงถูกยกเลิก
Peter Taylor

2

Mathematica 20 16 หรือ22 18 bytes

บันทึกด้วย 4 ไบต์โดย @swish

ส่งคืนคำตอบที่แน่นอน:

Area@SSSTriangle@

ตัวอย่าง

Area@SSSTriangle[2,3,4]

ภาพ


ในการส่งคืนคำตอบในรูปแบบทศนิยมจำเป็นต้องใช้ไบต์สองตัวเพิ่มเติม

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

2.90474


องค์ประกอบบันทึกสองไบต์Area@*SSSTriangle
หวด

@ ต้องขอบคุณมากชื่นชมมาก
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]);

useage:

php triangle.php
2,3,4

เอาท์พุท: 2.9047375096556

ฉันไม่คิดว่าฉันจะทำให้มันสั้นกว่านี้? ฉันยังใหม่กับการเล่นกอล์ฟ ทุกคนแจ้งให้เราทราบหากฉันมองข้ามบางสิ่ง

ขอบคุณ Primo ที่ช่วยฉันด้วย 1 ไบต์ฮ่า ๆ


1
สุดท้าย($s-$c[2])สามารถถูกแทนที่ด้วย$s-=$c[2]หนึ่งไบต์ แต่นั่นคือทั้งหมดที่ฉันเห็น
primo

@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, 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

Japtap , 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

Julia 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

เริ่มจากสูตรประจำของ Heron ที่เขียนโดย Kenneth Hammond (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))

ฉันได้แปลงสิ่งนี้เป็นวิกิชุมชนเพราะมันไม่ใช่งานของคุณ เราไม่มีความเห็นที่สอดคล้องกันเกี่ยวกับเรื่องนี้ แต่อย่าลังเลที่จะชั่งน้ำหนักในที่นี่หากคุณไม่เห็นด้วยกับการตัดสินใจของฉัน
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

ยินดีต้อนรับสู่ CodeGolf คุณควรตรวจสอบก่อนว่าโปรแกรมใช้งานได้และแสดงผลลัพธ์ออกมา มีข้อบกพร่องบางอย่างง่าย ๆ ในอันนี้
ugoren




0

APL (NARS), 16 ตัวอักษร, 32 ไบต์

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

หนึ่งมีการแปลงสูตร Erone ถ้า 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.