计算正多边形的面积


19

给定一个整数,n其中3 <= n < 2^32,计算正n态为1的正多边形的面积;的公式是n * tan(π / n)。对于那些不知道Apothem是什么的人:

正多边形的质点是从中心到边之一的中点的线段。

输出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个。

Answers:


9

Mathematica,16个字节

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

在线尝试!

当然,mathematica为此内置了

Area@*RegularPolygon

Area@RegularPolygon应该是Area@*RegularPolygon; 现在,它不能被捕获到变量中。也就是说,f = Area@RegularPolygon; f[3]不起作用。相关meta讨论
JungHwan Min'9

@JungHwanMin好的,我已修复它。(尽管我没有将其发布为答案。我只是在显示内置插件的乐趣)
J42161217



4

x87机器代码,11个字节

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

上面的代码字节定义了一个函数,该函数计算1的正整数的正n边形的面积。它使用x87 FPU指令(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

如您所见,这基本上只是给定公式的简单计算,
     结果= n * tan(π/ n)
仅指出了几件有趣的事情:

  • x87 FPU具有用于加载常数值PI(FLDPI)的专用指令。它很少使用,甚至在今天也是如此(现在明显减少了),但是它的大小比将常量嵌入二进制文件并加载它要短。
  • x87 FPU指令用于计算切线,FPTAN将结果替换输入寄存器的值(FPU堆栈的顶部),但还将常数1.0压入FPU堆栈的顶部。这样做是为了与8087向后兼容(我不知道为什么在8087上这样做;可能是一个错误)。这意味着我们需要将不需要的值从堆栈中弹出。最快和最短的方法是简单的FSTP st0,就像我们在这里使用的那样。我们也可以做一个乘法和弹出操作,因为乘以1.0不会改变结果,但是这也是2个字节(因此,代码长度没有胜利),执行起来可能会更慢,并且可能导致不必要的不​​确定性结果。

尽管现代的程序员或编译器将使用SSE(及更高版本)指令集而不是老化的x87,但这将需要更多的代码来实现,因为在这些较新的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

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,因此所有测试用例的屏幕截图如下所示:

在此处输入图片说明





0

C#(Mono C#编译器),24字节


=>n*Math.Tan(Math.PI/n)

在线尝试!


3
不幸的是,这既不是一个完整的程序,也不是一个功能。相反,这是一个代码段,此处不允许。但是,我认为您可以n=>从头开始,使之成为箭头功能(使用少量盐(不知道C#即可))是有效的。
caird coinheringaahing

您可以将代码段放入中System.Func<T, T>,将以a float作为输入,将另一个作为输出。声明看起来像这样:System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);,其中bytecount从处开始n=>。在我的示例中,我省略了两个括号以节省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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.