求和顶点连接


14

比方说,你有一个正整数ñ。首先,建立一个具有N个顶点的规则多边形,相邻顶点之间的距离为1。然后将每个顶点之间的线连接到另一个顶点。最后,计算所有行的总和。

给定输入N = 6,用连接每个顶点和其他顶点的线构建一个六边形

六边形

如您所见,总共有6条边界线(长度= 1),3条边界长度加倍(长度= 2)的线和其他6条线,我们可以使用毕达哥拉斯定理来计算,这是

如果将线的长度相加,我们将得到(6 * 1)+(3 * 2)+(6 * 1.732)= 22.392

附加信息

由于不将具有2个或更少顶点的结构视为多边形,因此NaN对于N = 1,输出0(或,因为单个顶点之间的距离没有多大意义),因为单个顶点无法连接到其他顶点,而对于1,则输出1 N = 2,因为两个顶点通过一条直线连接。

输入值

任何合理格式的整数N。

输出量

所有行的长度加总起来,至少精确到小数点后三位,可以作为函数返回值或直接打印到stdout

规则

  • 禁止出现标准漏洞。
  • 这是,因此以任何语言表示的最短代码(以字节为单位)将获胜。

祝好运!

测试用例

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392

1
我们真的必须处理1吗?nan例如,我当前的输入将返回而不是零,并且只需要特殊的大小写即可。
乔纳森·艾伦,

1
@JonathanAllan在看到您的答案后也考虑了这个问题,nan因为单个顶点之间的距离反而没有多大意义。
伊恩H.17年

6
n=1我认为您可能还应该允许引发错误。
乔纳森·艾伦

很难确定没有精确度上限的3个小数位意味着什么N,因为输出变大而浮点数变小。
xnor

@xnor只要对于任何合理的输入N精确到小数点后3位,它的好处就是对大数的结果不太精确。
伊恩H.17年

Answers:


13

Python 3 (with sympy 61 60 58 54  48字节

n=1得益于xnor(进一步的三角简化和进一步的高尔夫球处理来处理1的边缘情况并通过移动(现在是不必要的)强制转换来保存括号),因此-6(如果不需要,甚至可以是-10 float)。

希望没有第三方图书馆就可以打败吗?是!! 但是让事情开始吧...

lambda n:1%n*n/2/(1-cos(pi/n))
from math import*

在线尝试!

如果在单位圆内接有多边形,则使用长度总和的公式,n*cot(pi/2/n)/2并将边长为1的边长除以该索长的正弦,将结果调整为1 sin(pi/n)

第一个公式是通过考虑所获取的n-1从一个角发出的所有对角线其是长度中的线长度sin(pi/n)(再次),sin(2*pi/n),..., sin((n-1)pi/n)。其总和是cot(pi/2/n),有n角,因此我们乘以n,但是然后我们对所有线进行了重复计数,因此我们将其除以2。

n*cot(pi/2/n)/2/sin(pi/n)然后通过xnor 将结果简化为n/2/(1-cos(pi/n))(持有n>1

...现在(只要精度可以接受)就不再需要sympy内置math模块(math.pi=3.141592653589793)。


2
是!保存了11个字节。很酷的配方!
J42161217

1
看来公式简化为n/2/(1-cos(pi/n))
xnor

好去处@xnor(只要我们可以输出0.25n=1-但特殊的外壳可能会缩短太...)
乔纳森·艾伦

@JonathanAllan咦,奇怪的是1/4对的结果n=1。可以用修补1%n*。此外,可以通过将float内部移动到来保存括号float(1-cos(pi/n))。我不太了解sympy,但是也许有一种强制浮动的算术方法。
xnor

@xnor谢谢!(我应该注意到float此举)。sympy输出一个表达式-例如,对于n=6没有强制转换结果且带有表示的表达式3.0/(-sqrt(3)/2 + 1)-可能会有更短的方法,但我还不知道。
乔纳森·艾伦

7

Python,34个字节

lambda n:1%n*n/abs(1-1j**(2/n))**2

在线尝试!

使用从Jonathan Allann/2/(1-cos(pi/n))简化的公式。尼尔(Neil)指出Python可以计算单位根为的整数幂,因此节省了10个字节。1j

没有导入功能的Python没有内置的三角函数pie。为了n=1付出0而不是付出是0.25我们的前提1%n*

仅使用自然数幂的较长版本:

lambda n:1%n*n/abs(1-(1+1e-8j/n)**314159265)**2

在线尝试!


1
泰然自若。
乔纳森·艾伦

37个字节:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil

@Neil哇,Python只能计算统一根。
xnor

好吧,那很容易。我不知道怎么办abs()
尼尔

@Neil会获取绝对值,从而得到标准值,即距原点的距离。
乔纳森·艾伦,

6

MATL16 15字节

t:=ZF&-|Rst2)/s

在线尝试!验证所有测试用例

这使用了引入了FFT(快速傅立叶变换)功能的提交,该提交将挑战提前了8天。

说明

该代码使用此技巧(适应于MATL)生成统一根。这些选项将顶点的位置指定为复数,但连续顶点之间的距离未归一化为1。要解决该问题,在计算所有成对距离后,程序会将它们除以连续顶点之间的距离。

t       % Implicit input, n. Duplicate
:       % Range: [1 2 ... n-1 n]
=       % Isequal, element-wise. Gives [0 0 ... 0 1]
ZF      % FFT. Gives the n complex n-th roots of unity
&-|     % Matrix of pairwise absolute differences
R       % Upper triangular matrix. This avoids counting each line twice.
s       % Sum of each column. The second entry gives the distance between
        % consecutive vertices
t2)/    % Divide all entries by the second entry
s       % Sum. Implicit display

1
这很漂亮
约拿(Jonah)

@Jonah复数FTW :-)
Luis

5

蚱hopper,25个基元(11个组件,14条电线)

我阅读了有关GH和LabVIEW中程序的元文章,并按照类似的说明来测量视觉语言。

grasshopper program

<null>N =的打印0, 1, 2,因为Polygon Primitive无法生成具有2个或更少边的多边形,并且您将得到一个空的线列表。

组件从左到右:

  • Side count 滑块:输入
  • 多边形基本体:在画布上绘制多边形
  • 爆炸:将折线爆炸为segestion和顶点
  • 交叉参考:在所有顶点之间建立整体交叉参考
  • 线:在所有线对之间画一条线
  • 删除重复行
  • 曲线长度
  • (上)总和
  • (下)除法:由于Polygon Primitive基于半径绘制多边形,因此需要缩放形状
  • 多元化
  • 面板:输出

rhino screenshot



2

Haskell,27个字节

f 1=0
f n=n/2/(1-cos(pi/n))

在线尝试!

我只是参加了Haskell,所以这真是一个不错的初学者高尔夫(也就是说,从其他答案中复制公式)。

我也尽力将其放置在$某个地方,但是编译器一直对我大吼大叫,所以这是我所拥有的最好的。:P


2

果冻13 12 11字节

使用乔纳森·艾伦的公式(并感谢他节省了2个字节)

ØP÷ÆẠCḤɓ’ȧ÷

在线尝试!

我一直对Jelly十分着迷,但是并没有经常使用它,因此这可能不是最简单的形式。


通过使用“参数交换二元链分隔”来保存字节ɓ,以这样的方式内联您的助手链接:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan

@JonathanAllan哦,谢谢,我仍然是一个初学者,他知道可能有比拥有新连锁店更好的方法,但不知道如何做
Jeffmagma

哦,我们可以通过使用减量和逻辑与(ȧØP÷ÆẠCḤɓ’ȧ÷:) 来保存另一个值:
乔纳森·艾伦

噢,谢谢,我没想到这一点
Jeffmagma

1

Javascript(ES6),36个字节

n=>1%n*n/2/(1-Math.cos(Math.PI/n))

@JonathanAllan的Python 3答案端口

f=n=>1%n*n/2/(1-Math.cos(Math.PI/n))
<input id=i type=number oninput="o.innerText=f(i.value)" /><pre id=o>

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.