三角形のアスペクト比を評価する


35

三角形の3つの辺の長さを与え、そのアスペクト比ARを評価します、次の式を使用してます。

enter image description here

どこで

enter image description here

三角形が等辺に近いほど、1そのアスペクト比に近くなります。1有効な三角形のアスペクト比は、それ以上です。

入力

入力は、リストまたは必要に応じて同様のものにカプセル化できる3つの正の実数です。

3つのサイドレングスが入力される順序に関係なく、プログラムは同じ値を出力する必要があります。

これらの3つの数値は、常に三角形の有効な辺の長さです(sidelengthsのある縮退した三角形11あり2、入力として与えられません)。値が縮退三角形に極端に近くなった場合、浮動小数点の不正確さを心配する必要はありません(たとえばdivision by 0、入力でプログラムがエラーになることは許容されます[1, 1, 1.9999999999999999])。

入力はSTDIN、を介して、関数の引数、または類似のものとして与えることができます。

出力

出力は、1言語で許容される標準精度以上の実数です。

出力は、に出力されSTDOUTたり、関数から返されたり、類似したものになります。

テストケース

Inputs                   Output

  1      1      1         1
  3      4      5         1.25
 42     42   3.14         ≈ 6.9476
 14      6     12         1.575
  6     12     14         1.575
0.5    0.6    0.7         ≈ 1.09375

得点

これはであるため、バイト単位の最短回答が優先されます。


べきS BE (+ B + C)/ 3
costrom

3
@costromいいえ、式は正しいです。sは、三角形半周囲です。正三角形の数式は未定義になります。
16:

入力用に浮動小数点数を取得できますか、整数も取得する必要がありますか?
エリックアウトゴルファー

@ErikGolferエリックゴルファーの42.0代わりに入力することもでき42ます。
16年

@Fatalizeありがとう。また、入力はすべて可能0ですか?
エリックアウトゴルファー

回答:


19

ゼリー、6バイト

この回答は、エミグナの05AB1E回答に基づいています。この答えを理解するのを助けてくれたデニスとリンに感謝します。ゴルフの提案を歓迎します!オンラインでお試しください!

S_Ḥ⁸÷P

アンゴルフ

           Implicit argument [a, b, c].
S          Take the sum, a+b+c or 2*s
  Ḥ        Take the double, [2*a, 2*b, 2*c].
 _         Vectorized subtract, giving us [2*(s-a), 2*(s-b), 2*(s-c)].
   ⁸÷      Vectorized divide the initial left argument, the input [a, b, c],
             by [2*(s-a), 2*(s-b), 2*(s-c)].
     P     Take the product giving us the aspect ratio, abc/8(s-a)(s-b)(s-c).

4
6バイトで、まだゴルフの提案が必要ですか?:-D
ルイスメンドー

1
@LuisMendo可能であれば、必ず:D
Sherlock9

1
「プッシュ」は正確な用語ではありません。Jellyはスタックベースではありません。むしろ、⁸÷ユニットとしてチェーンから外れてしまい、最初の左の引数をthis、または何かで除算して読む必要があります。
リン

1
@Lynn私は実際に数ヶ月間ゴルフをしています。スタックベースの用語は私の頭の中にしっかりとくっついています:D今すぐ修正する必要があります。
Sherlock9

56

ゼリー、7バイト

SH_÷@HP

オンラインでお試しください!

説明

enter image description here

このチェーンを読みましょう:

  • 暗黙の引数はリスト[a, b, c]です。

  • 最初に読みますS。これには合計が必要ですa + b + c

  • 次に、読み取りますH。これにより、半分になります(a + b + c)/2。(これはs。)

  • 次に、ダイアド_(減算)を読み取り、続いて別のダイアドを読み取ります。これはフックです。正しい引数がないため、このチェーンへの引数を受け取り[a, b, c]、を提供し[s-a, s-b, s-c]ます。(これは、この表の5番目のチェーンパターンです。)

  • 次に、dyad-monadのペアを読み取ります÷@H。これは分岐です:÷@引数が反転された除算であり、H半分になっているため、作業値はHこのチェーンの引数の半分になります÷それによってします。これはベクトル化します。残ってい[(a/2)/(s-a), (b/2)/(s-b), (c/2)/(s-c)]ます。(これは、この表の2番目のチェーンパターンです。)

  • 最後に、製品を P取得しabc/(8(s-a)(s-b)(s-c))ます。

リンクがどのように適合するかを示すツリー状のグラフを表示します。


8
画像は素晴らしいですね!いい感じです!
-DavidC

2
私は一番上の画像を自分で小さくし、2番目の画像をリンクにしました(しゃれはありません)。
リン

イメージを見て、すぐに「いいね、リン!」と思いました。誰が投稿したかを見る前に;-)
ETHproductions

7
私がゼリープログラムについて見た最高の説明。まだわかりませんが、もっと詳しく!
スパー

テストケース「6.0,12.0,14.0」に対してサンプルを実行し、テストケースに示されているように、1.575の代わりに「-0.8888888888888888」を返しました。テストケースまたはコードに問題がありますか?
MBaas

13

ゼリー、6バイト

S÷_2Pİ

オンラインでお試しください!

使い方

S÷_2Pİ  Main link. Argument: [a, b, c]

S       Sum; compute 2s := a + b + c.
 ÷      Divide; yield [2s ÷ a, 2s ÷ b, 2s ÷ c].
  _2    Subtract 2; yield [2s ÷ a - 2, 2s ÷ b - 2, 2s ÷ c - 2].
    P   Product; yield (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).
     İ  Invert; yield 1 ÷ (2s ÷ a - 2)(2s ÷ b - 2)(2s ÷ c - 2).

ああ、私は³⁴⁵引数として使用しようとしました...
エリックアウトゴルファー

11

JavaScript、38バイト

これは(カリー化された)ラムダです:

a=>b=>c=>a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

(変数に割り当てる場合、次のfように呼び出す必要がありますf(3)(4)(5)


数秒で私を打ってください:)式が質問によって提供されたものと同様にどのように機能するかを説明してください。
Kritixi Lithos

@KritixiLithosだけのプラグインs = 1/2(a+b+c)式と簡素化に:D(例えばs-a = .5*b+.5*c-.5*a、の三つの要因.5とキャンセル8
flawr

5
(a,b,c)=>は同じ長さで、呼び出しにかかるバイト数が少ない;)
ETHproductions

4
しかし、私はカレーが大好きです:D
flawr


8

MATL8 7バイト

tsGE-/p

オンラインでお試しください!

説明

[3 4 5]例として入力を使用してみましょう

t    % Take input implicitly. Duplicate
     % STACK: [3 4 5], [3 4 5]
s    % Sum of array
     % STACK: [3 4 5], 12
G    % Push input again
     % STACK: [3 4 5], 12, [3 4 5]
E    % Multiply by 2, element-wise
     % STACK: [3 4 5], 12, [6 8 10]
-    % Subtract, element-wise
     % STACK: [3 4 5], [6 4 2]
/    % Divide, element-wise
     % STACK: [0.5 1 2.5]
p    % Product of array. Implicitly display
     % STACK: 1.25

8

R、34 29バイト

x=scan();prod(x/(sum(x)-2*x))

stdinから入力を読み取り、R-vectorとして保存しxます。次に、Rのベクトル化を使用して分母を作成します。


7

Haskell、36バイト

これは、#3つの引数を取る関数を定義します。

(a#b)c=a*b*c/(b+c-a)/(a+c-b)/(a+b-c)

次のように呼び出す必要があります。 (3#4)5

少し長くなりますが、おそらくよりゴルフに適しています:

p=product
f v=p v/p((sum v-).(2*)<$>v)

6

MATLAB、64 38 25バイト

これは、提供されている式を実装する任意の関数です。

@(v)prod(v./(sum(v)-2*v))

それは、入力が3つの値のリストであると仮定します[3,4,5]。この例は、次の説明で使用されます。

             sum(v)        = 3+4+5 = 12
             sum(v)-2*v    = 12 - 2*[3,4,5] = 12 - [6,8,10] = [6,4,2]
         v./(sum(v)-2*v))  = [3,4,5] ./ [6,4,2] = [0.5,1,2.5]
    prod(v./(sum(v)-2*v))  = 0.5 * 1 * 2.5 = 1.25

6

Mathematica、20バイト

1##&@@(#/(Tr@#-2#))&

#関数内で参照される3つの値のリストとして入力を受け取ります。Tr@リストを合計する(取得する2s)最短の方法であり、inの1##&@@(...)3つの要素i/(2s-2i)を乗算iしますa, b, cます。

入力が整数または有理数の場合、正確な結果が得られます。



5

OCaml、51バイト

fun a b c->a*.b*.c/.(b+.c-.a)/.(a+.c-.b)/.(a+.b-.c)

いや、フロート用の個別の演算子...


5

ワンダー、48バイト

@@@prod[#0#1#2/1- +#1#0#2/1- +#2#0#1/1- +#2#1#0]

RIP

使用法:

(((@@@prod[#0#1#2/1* * - +#1#0#2- +#2#0#1- +#2#1#0])3)4)5

説明

関数呼び出しは、他の言語の挿入演算子と比較すると、Wonderではコストがかかります。このため、すべての用語を配列に格納し、すべての用語を乗算する代わりに結果の積を取得しました。コードは次のようなものになります。

(a,b,c)=>product([a,b,c,1/(b+c-a),1/(a+c-b),1/(a+b-c)])

1
うーん、なぜ「RIP」ですか?
ルイスメンドー

必要以上に長いです
ママファンロール

5

実際には10 8バイト

この回答は、デニスの優れたゼリーの回答に基づいています。ゴルフの提案を歓迎します!オンラインでお試しください!

;Σ♀/♂¬πì

アンゴルフ

     Implicit input [a, b, c].
;    Duplicate [a, b, c].
Σ    sum() to get twice the semiperimeter, 2*s.
♀/   Vectorized divide 2*s by [a, b, c] to get [2*s/a, 2*s/b, 2*s/c].
♂¬   Vectorized subtract 2 to get [2*s/a-2, 2*s/b-2, 2*s/c-2].
π    Get the product of the above to get 8*(s/a-1)*(s/b-1)*(s/c-1).
     This is the same as 8(s-a)(s-b)(s-c)/abc.
ì    Invert to get the aspect ratio, abc/8(s-a)(s-b)(s-c).
     Implicit return.

5

Minecraft 1.8、1607バイト+ 85ブロック= 1692ブライト

警告:ゴルフされていません。ゴルフには1 /かかります 3以下blytes。

コメント付きのスクリーンショットは次のとおりです。

enter image description here

  • 入力はabc、と出力されますfin

  • fin、およびMinecraftの他のすべての変数は整数であるため、標準のMinecraftの精度は0小数点です。

  • 緑の境界線:左側のコマンドブロックは、右側のコマンドブロックの後にアクティブになります。これは、変数の初期化のみです。

  • レバー(右下の灰色がかった茶色の長方形)は、仕掛けトリガーです

  • Minecraftが変数を処理する方法のため、非常に多くの時間がかかります。非常に簡略化された概要:

    • /scoreboard objectives add name dummy 「」という名前の新しい変数を作成しますname

    • /scoreboard players set @p name number 変数を設定します nameをにnumber。数値は、変数ではなく実数でなければなりません。

    • /scoreboard players operation @p name += @p name2増加nameによってname2ます。name2数値ではなく変数でなければなりません。

      • -=/=*==より代わりに使用することができる+=減少し、乗算、除算、等
  • ここに43個のコマンドすべてを投稿するつもりはありません。これはゴルフをするのに役立ちますが、クレイジーなコピー貼り付けをするのにも役立ちます

  • 1.9コマンドブロックが使用される場合、ソリューションは(少なくとも)42ブロック少なくなります。1文字の変数を使用すると、ほぼ200バイトが節約されます。


4

Java、38バイト

(a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c)

テストと未使用

public class Pcg101234 {
  interface F {
    double f(double a, double b, double c);
  }
  public static void main(String[] args) {
    F f = (a,b,c)->a*b*c/(b+c-a)/(a-b+c)/(a+b-c);

    System.out.println(f.f(1,1,1));
    System.out.println(f.f(3,4,5));
    System.out.println(f.f(42,42,3.14));
    System.out.println(f.f(14,6,12));
    System.out.println(f.f(6,12,14));
    System.out.println(f.f(0.5,0.6,0.7));
  }
}

試して!

出力

1.0
1.25
6.947606226693615
1.575
1.575
1.09375

(a,b,c)ここには、型情報が含まれていないため、ちょっと浮気しているように感じます。IMOは、暗黙のラムダインターフェイス(あなたの場合F)が合計バイト数にカウントされる必要があります。
F.ジョージ

4
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIuラムダを強くお勧めします。また、ほとんどのJava 8エントリは、コメントなしでそのように機能します。あなたが同意していないと私がだましたと思うなら、この記法が受け入れられるかどうかをメタで正式に尋ねることを勧めます。その間、以前のJava 8の回答に沿って調整します。
オリビエグレゴワール

4

クラゲ17 16バイト

1バイトを節約してくれたZgarbに感謝します。

p%/*-)/+i
    2%

オンラインでお試しください!

説明

これは、デニスの答えと同じ逆算式に基づいています

より伝統的な関数表記では、上記のプログラムは次のようになります。

print(
  1 / fold(
    multiply,
    fold(add, i) / i - 2
  )
)

i入力リストはどこにありますか。fold(multiply, ...)積とfold(add, ...)合計を計算するだけなので、これをさらに単純化できることに注意してください。

print(1 / product(sum(i) / i - 2))

sum(i) / iフックを介して実行され)/+、一度に両方の手順を実行するための新しい単項関数を定義します。


フックでバイトを保存します。
-Zgarb

4

Dyalog APL10 9 バイト

×/⊢÷+/-+⍨

これは、匿名関数トレイン(フォークのフォークのトップ)です。つまり、次の構造内で、すべてのサブ関数が引数に適用されます。

 ┌─┴─┐          
×/ ┌─┼───┐      
    ÷ ┌─┼──┐  
      +/ - +⍨

TryAPLオンライン!

×/ の製品

引数

÷ で割った

+/ 引数の合計

- マイナス

+⍨ 引数が2倍になりました(それ自体に追加されます)

数学的な背景。

ngnはバイトを削りました。


こんにちはアダム、pls。忘れてしまったら、来週「⊢」について尋ねることを思い出してください:
MBaas

「バックグラウンド」リンクがこの答えにどのように関係しているのかわからないのは、アルゴリズムがまったくないからです。また、操作の順序に関する情報を追加できますか?さまざまな操作順序でいくつかの異なる言語でこの回答を再現しようとしましたが、質問の回答とは異なる回答が常に返されます。

@catまあ、これはアルゴリズムを提供することを意図したものではなく、アスペクト比が何であるかを説明するためだけのものでした。Wikipediaにはそのようなページはありません。APLは右から左です。つまり、すべての関数は、その右側にあるものを引数として受け取ります。したがって、説明のように左から右に読むことができます。
アダム16


3

dc、49バイト

5k?dsa?dsb?dsc++2/sslalblc**lsla-lslb-lslc-8***/p

指定された式の直接実装。3つの別々の行での呼び出し時に3つの入力を要求し、小数点以下5桁の浮動小数点値を次の行に出力します。

説明

5k                                                # Set the output precision to 5 digits after the decimal
  ?dsa                                            # Prompt for first input value on first line, duplicate it, and then store it in register `a`
      ?dsb                                        # Prompt for second input, duplicate it, and store it in register `b`
          ?dsc                                    # Prompt for third input, duplicate it, and store it in register `c`
              ++2/ss                              # Sum up the 3 values on the main stack, then divide sum by 2 and store the result in register `s`
                    lalblc**                      # Copy all three values from registers `a`,`b`,`c` onto the main stack, find their product, and push result to top of main stack
                            lsla-                 # Copy value from register `s` onto main stack, subtract register `a`'s value from it, and push result to main stack
                                 lslb-            # Copy value from register `s` onto main stack, subtract register `b`'s value from it, and push result to main stack
                                      lslc-       # Copy value from register `s` onto main stack, subtract register `c`'s value from it, and push result to main stack
                                           8***   # Find the product of the top three values and 8 and then push the result to main stack
                                               /p # Divide the second to top value (a*b*c) by the top of stack value (8*(s-a)*(s-b)*(s-c)), push the result to the main stack, and then output the result to STDOUT

3

TI-Basic、11バイト

入力は、などのリスト形式である必要があります{A B C}

prod(Ans)/prod(sum(Ans)-2Ans

たぶん、このビジュアルが役立ちます(覚えておいてください2s = a+b+c):

      abc abc abc prod(Ans)
---------------- = --------------------- = ----------- -------- = -------------------
8(sa)(sb)(sc)(2s-2a)(2s-2b)(2s-2c)(a + b + c)(1-2 {a、b、c})prod(sum(Ans) -2Ans)



2

4番目、83バイト

浮動小数点パラメーターは、浮動小数点スタックで開始すると想定しています。結果を浮動小数点スタックに残します。Forthの標準は、params / returningにスタックを使用することです。

: p 3 fpick ;
: T p p p ;
: f 0 s>f T f- f+ f- T f+ f- f* T f- f- f* 1/f f* f* f* ;

オンラインで試す -すべてのテストケースが含まれています

式を使用しa*b*c * 1/ ( -(a+b-c) * -(b+c-a) * (a+c-b) )ます。ほとんどすべてのプログラムは、浮動小数点スタックのみを使用しています。例外は3in 3 fpickです。このプログラムには、以下をサポートするインタープリターが必要です。fpick(Ideoneは動作しますが、repl.itは動作しません)。

説明: やや少ないゴルフ

\ 3 fpick takes the 3rd element (0-indexed) and pushes a copy
\ Used to copy parameters on the stack over another number 'x' ( a b c x -> a b c x a b c )
: f3p 3 fpick 3 fpick 3 fpick ;

: f                     \ define a function f
0 s>f f3p f- f+ f-      \ push a zero, copy params, compute 0-(a+b-c)
                        \ the zero allows me to copy (I need an 'x' to jump over)
f3p f+ f- f*            \ copy params and compute -(b+c-a), multiply by previous result
                        \ the negatives miraculously cancel
f3p f- f- f*            \ copy and compute (a+c-b), multiply by previous result
1/f f* f* f* ;          \ take the reciprocal and multiply by a*b*c
                        \ the result is left on the floating point stack

2

ised:19バイト

@*$1/@*{@+$1-2.*$1}

スペースで区切られた配列を持つファイル、またはpipe / stdinから受信できるised --l 'inputfile.txt' '@*$1/@*{@+$1-2.*$1}' 場所として呼び出しinputfile.txtます-

Unicodeバージョン(同じバイト数ですが、3文字以下):

Π$1/Π{Σ$1-2.*$1}

残念ながら、ised入力引数の構文のために多くの文字を無駄にします。


2

vba、76

Function r(a,b,c)
s=(a+b+c)/2:r=(a*b*c)/(8*(s-a)*(s-b)*(s-c))
End Function

で呼び出す

?r(3,4,5)

またはに優れている

= r(5,12,13)


@ SuperJedi224のアルゴリズムで6バイトを保存しますPublic Function r(a,b,c):r=a*b*c/(b+c-a)/(a-b+c)/(a+b-c):End Function
。– steenbergh

2

C#、82バイト

void ar(double a,double b,double c)=>Console.Write(a*b*c/(b+c-a)/(a+c-b)/(a+b-c));

使用法:

ar(42, 42, 3.14);


2

k、19バイト

{(*/x)%8*/-x-+/x%2}

右から左に評価-リストxを2で除算し、結果を合計して元のxから減算します。答えを否定し、結果と8の積を取得します。結果は分母で、分子はリストの積です。


1

Lua、45バイト

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

JavaScriptの回答に大きく基づいています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.