三角形のエリアサイドサイドサイド


17

三角形の3辺を与え、この三角形の領域を印刷します。

テストケース:

で: 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文字バージョンi4%~%:*/(+/,+/-+:)i

オリジナルの23文字バージョン: (%:@(+/**/@(+/-+:))%4:)


7

APL 21 20

←⎕を介して画面入力を取得します

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

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
より良い解決策を考え出すのに多くの時間を費やしました。私はこれが得ると同じくらい良いと確信しています
ジャミラック

2
@jamylakあなたと私両方;)
primo

6

Mathematica 23

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

ちょっとしたコメント。ここでは(通常)Mmaコードを関数として提供しようとします。たとえば、あなたの場合Sqrt[Tr@#*Times@@(Tr@#-2#)]/4&
ベリサリウス博士13年

2
関数としての28文字、(Tr@#Times@@(Tr@#-2#))^.5/4&または変数を使用した27 文字
Dr. 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行目/2ですか?
jdstankosky

@jdstankosky Pythonの除算演算子はデフォルトで整数除算であるため、の合計a+b+cが奇数の場合、結果はエラーになります。これはPython 3で変更されました。ただし、特に指定されない限り、ほとんどのゴルフの提出はPython 2.7であると想定されます(Perlの提出はPerl 6ではなく5.10+と想定されます)。
プリモ

3
「Python」の代わりに「Python 3」と言うことができます。
ジョーZ.

1
@JoeZ。いや。これはPython 2です。Python 3では、input()は文字列を返し、このソリューションを破壊します。
クルドラエセスナバルヤ

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

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

良くはありませんが楽しいです:)またHeron ...

:コンソールから実行して結果を確認してください。

88-> 85:削除abおよびc


1
一度に2で割るだけで少し節約できます。そして、変数に代入しても実際には何も得られません:(a=v[0])aはより大きいv[0]v[0]です。
ピーターテイラー

s=(v[0]+v[1]+v[2])/2a、b、c = 3,4,5のように2で1回だけ除算すると"345"/2=172.5" and not 6. Improved without , b`になりcますが。
-tomsmeding

ああ、JavaScriptのすばらしい型システムです。OK、s=(-v[0]-v[1]-v[2])/2もう一方-をに変更し+ます。項の数が偶数なので、キャンセルされます。
ピーターテイラー

2

Mathematica 20 16または22 18バイト

@swishによって4バイトが保存されます。

これは正確な答えを返します。

Area@SSSTriangle@

Area@SSSTriangle[2,3,4]

image


10進形式で回答を返すには、2バイト追加する必要があります。

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

短くすることはできないと思いますか?ゴルフは初めてです。何か見落としている場合は誰にでも知らせてください。

Primoに1バイト節約してくれてありがとう、笑。


1
ファイナル($s-$c[2])$s-=$c[2]1バイトで置き換えることができますが、それがすべてです。
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))

Heronの式に基づいた別のJavaScriptソリューションですが、変数をロードするための異なるアプローチを試みています。コンソールから実行する必要があります。各側は個別のプロンプトに入力されます。

編集:の戻り値を利用evalして2文字を保存します。@tomsmedingを破って、ワフー!:)


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

Japt17 16 15バイト

½*Nx
NmnU ×*U q

試して

ETHが冗長な改行を指摘し、アレイを削減するいくつかの代替方法のおかげで2バイトを節約しました。


私はあなたがあまりにも、二行目のためにこれらのいずれかを使用することができると思う:NmnU ×*U qNmnU r*U qNp0 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。


aとしてproc、それはたった81バイトに拡張します:tio.run
##NYo7CoAwEAV7T

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)によって書かれ 2バイトのゴルフをしました。TI-BASICがトークン化されていることを注意し、各トークンなどAnsprod(、計算機のメモリ内の1つの又は2バイトです。

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

これはあなた自身の作品ではないので、これをコミュニティwikiに変換しました。私たちはこれについて確かなコンセンサスを持っているわけではありませんが、私の決定に同意しない場合はここで自由に検討してください
マーティンエンダー



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

こんにちはiamプログラミングの初心者です。エラーがあれば教えてください。
シャーラス

CodeGolfへようこそ。最初に、プログラムが機能し、何らかの形で結果が出力されることを確認する必要があります。これにはいくつかの単純なバグがあります。
ウゴレン




0

APL(NARS)、16文字、32バイト

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

a、b、cが三角形の辺である場合、Erone式をセントバートする必要があります

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.