正多角形の面積を計算する


19

整数が与えられた場合、nここで3 <= n < 2^32n1のapothemを持つ通常の-gonの面積を計算します。の式はn * tan(π / n)です。悪魔が何であるかを知らない人のために:

正多角形のアポテムは、中心からその辺の1つの中点までの線分です。

n-gon の領域を小数点以下8桁以上の浮動小数点として出力します。

テストケース

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

注:上記のテストケースには、出力に必要な数字より2桁多く含まれています。

回答:


9

Mathematica、16バイト

N[Tan[Pi/#]#,9]&

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

もちろん、数学にはこれが組み込まれています

Area@*RegularPolygon

Area@RegularPolygonする必要がありArea@*RegularPolygonます; 現在のように、変数にキャプチャすることはできません。つまり、f = Area@RegularPolygon; f[3]機能しません。関連するメタディスカッション
ジョンファンミン

[OK]を@JungHwanMin、私はそれを固定(answer.Iは楽しみのためだけにビルトインを見せていたとして、私はそれを投稿しませんでしたが)。
J42161217


6

実際には、5バイト

╦/Tß*

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


どうやって?

╦/Tß*フルプログラム。

Pi Piを押します。
 / ^を入力で除算します。
  Tタンジェント。
   ß*入力で乗算します。
        暗黙的に出力します。

代替:ß╦/T*o_O実際に実際にゼリーを打ちます!!!


2バイトの組み込み名...
エリックアウトゴルファー

はい、私は知っている... @EriktheOutgolferをPythで3バイトの組み込み関数かかわらず> <。
氏Xcoder

3
実際に実際にゼリーを打ちます!!!」の+1 。;)
ケビンクルーイッセン

4

x87マシンコード、11バイト

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

上記のコードバイトは、アポセム1の通常のnゴンの面積を計算する関数を定義します。x87FPU 命令(x86プロセッサの古典的な浮動小数点ユニット)を使用してこの計算を行います。

標準のx86レジスタベースの呼び出し規約(この場合は__fastcall)に従って、関数の引数はECXレジスタに渡される整数へのポインタです。関数の結果は、x87浮動小数点スタック(レジスターST0)の最上部に返される浮動小数点値です。

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

非ゴルフアセンブリニーモニック:

D9 EB  fldpi                  ; load constant PI at top of FPU stack
DA 31  fidiv DWORD PTR [ecx]  ; divide PI by integer input (loaded from pointer
                              ;   in ECX), leaving result at top of FPU stack
D9 F2  fptan                  ; compute tangent of value at top of FPU stack
DD D8  fstp  st0              ; pop junk value (FPTAN pushes 1.0 onto stack)
DA 09  fimul DWORD PTR [ecx]  ; multiply by integer input (again, loaded via ECX)
C3     ret                    ; return control to caller

ご覧のとおり、これは基本的に、指定された式の単純な計算
     結果です。result= n * tan(π/ n)
興味深い点がいくつかあります。

  • x87 FPUには、定数値PI(FLDPI)をロードするための専用命令があります。これはめったに使用されませんでした(当時は明らかにそうではありませんでした)が、バイナリに定数を埋め込みロードするよりもサイズが短くなっています。
  • 計算接線のx87 FPU命令はFPTAN、結果入力レジスタ(FPUスタックの最上位)の値を置き換え、しかしまた、 FPUスタックの最上部に一定1.0を押します。これは8087との後方互換性のために行われます(これが8087で行われた理由がわかりません。おそらくバグです)。つまり、この不要な値をスタックからポップする必要があります。FSTP st0ここで使用するように、これを行うための最速かつ最短の方法はシンプルです。1.0を乗算しても結果は変わらないため、multiply-and-popを実行することもできますが、これは2バイトであるため(コードサイズが増加しないため)、実行速度が遅くなり、不必要な不確定性が生じる可能性があります結果。

最新のプログラマーまたはコンパイラーは、古くなったx87ではなく、SSE(およびそれ以降)の命令セットを使用しますが、これらの新しいISAでタンジェントを計算する単一の命令はないため、実装するためにより多くのコードが必要になります。









2

var'aq、51バイト

'Ij latlh HeHmI' tam boqHa''egh qojmI' boq'egh cha'

説明

'Ij        - read from STDIN
latlh      - duplicate top of stack
HeHmI'     - push PI onto stack
tam        - swap first 2 elements on stack
boqHa''egh - divide
qojmI'     - take tangent
boq'egh    - multiply
cha'       - print


2

JavaScript(ES6)、24バイト

x=>x*Math.tan(Math.PI/x)

それを試してみてください

o.innerText=(f=
x=>x*Math.tan(Math.PI/x)
)(+i.value);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number value=3><pre id=o>


1

Python 2、45バイト

from math import*
n=input()
print n*tan(pi/n)

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



:私は本当にそれゆえ...ちょうどフッターにプリントを入れてバイトを保存するためにラムダを使用して嫌いだ。このようなシャロンで44バイト
サイモンを

4
@Simonなんで?関数は有効な送信です-値を出力するか、関数から返すことができます。フッターに印刷する必要はありません。
スティーブン

1

Pyth、9バイト

*.tc.n0Q2

テストスイート。


どうやって?

* .tc.n0Q2完全なプログラム。Qは入力を意味します。

    .n0 Pi。 
   c除算:
       Q入力。
 .t 2タンジェント。
* Q入力で乗算します。
             暗黙的に出力します。




1

Perl、14 + 16 = 30

perl -MMath::Trig -ple'$_*=tan(pi/$_)'

適切なプログラムには14バイト、コマンドラインスイッチには16バイト



0

IBM / Lotus Notes式言語、13バイト

a*@Tan(@Pi/a)

数式を含むフィールドと同じフォーム上のaという名前のフィールドを介して取得した入力。TIOが利用できないため、以下に示すすべてのテストケースのスクリーンショット:

enter image description here





0

3
残念ながら、これは完全なプログラムでも機能でもありません。代わりに、ここでは許可されていないスニペットです。ただし、n=>これを矢印関数に変更するために、最初に追加することができると思います(これを少しつまみながら、C#がわかりません)。これは有効です。

スニペットをに配置するとSystem.Func<T, T>float入力としてを、出力として別のスニペットを使用できます。宣言は次のようになります。System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);バイトカウントはから始まりn=>ます。私の例では、2バイトを節約するためにブラケットを2つ省略しました;)
Ian H.

0

RPNGolf 0.6 / 0.7、12バイト

tbp-1mBsdmcc

スタックベースの新しい言語であるRPNGolfを使用した最初の投稿!

これは、標準入力から整数を読み取り、出力を標準出力に出力する(末尾の改行なしで)完全なプログラムです。

説明:

tb              # push user input from STDIN as int
  p             # duplicate top of stack
   -1           # push -1
     mB         # pop i, push inverse cosine of i
       s        # swap top two items on the stack
        d       # pop b, pop a, push a/b
         mc     # pop i, push tangent of i
           c    # pop b, pop a, push a*b
# RPNGolf implicity prints the stack upon normal exit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.