頂点接続の合計


14

正の整数Nがあるとしましょう。最初に、N個の頂点を持ち、隣接する頂点間の距離が1である通常のポリゴンを作成します。次に、すべての頂点から他のすべての頂点まで線を接続します。最後に、合計されたすべての行の長さを計算します。

入力N = 6を指定すると、すべての頂点を他の頂点と接続する線で六角形を構築します。

六角形

ご覧のとおり、合計6本の境界線(長さ= 1)、2倍の境界線長さ(長さ= 2)、およびピタゴラスの定理を使用して、 、

行の長さを合計すると、(6 * 1)+(3 * 2)+(6 * 1.732)= 22.392になります。

追加情報

2つ以下の頂点を持つ構造はポリゴンと見なされNaNないため、1つの頂点は他の頂点に接続できないため、N = 1の場合は0(または1つの頂点間の距離はあまり意味がないため)を出力し、 N =2。2つの頂点が1本の線で接続されているため。

入力

合理的な形式の整数N。

出力

すべての行の長さを合計すると、関数の戻り値として、またはに直接出力され、小数点以下3桁まで正確stdoutです。

ルール

  • 標準的な抜け穴は禁止されています。
  • これはであるため、どの言語でもバイト単位の最短コードが優先されます。

幸運を!

テストケース

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

1
本当に処理する必要があり1ますか?私の現在のエントリはnan、たとえばゼロではなく戻り、特別な大文字小文字が必要になります。
ジョナサンアラン

1
@JonathanAllanあなたの答えを見た後に考えましたnanが、単一の頂点間の距離はとにかくあまり意味をなさないので、それも問題ありません。
イアンH.

6
おそらく、エラーがスローされることを許可する必要がありn=1ます。
ジョナサンアラン

N出力が大きくなり、浮動小数点数の精度が低下するため、小数点以下3桁の精度が上限を持たないことを意味するのは困難です。
xnor

@xnor妥当な入力Nに対して小数点以下3桁まで正確である限り、結果は巨大な数値に対してあまり正確ではありません。
イアンH.

回答:


13

Python 3 sympyを使用 61 60 58 54  48バイト

-6(処理する必要がない場合は-10になることもありますn=1xnorのおかげです(さらに三角関数の単純化に加えて、1のエッジケースを処理し、(不要になった)floatキャストを移動して括弧を保存するためのさらなるゴルフ)。

うまくいけばなしでbeatable サードパーティのライブラリ?はい!! しかし、物事をローリングさせましょう...

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

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

これは、ポリゴンが単位円の内側に内接している場合、長さの合計の式を使用し、n*cot(pi/2/n)/2そのコード長のsinで割ることにより、辺の長さが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.25のためのn=1-しかし、特殊なケースがあまりにも短くなることがあり...)
ジョナサン・アラン

@JonathanAllan Huh、それ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 Allanからn/2/(1-cos(pi/n))簡略化さた式を使用します。ニールは、Pythonがユニティの根をの小数ベキとして計算できることに注意することで10バイトを節約しました1j

インポートのないPythonには、組み込みの三角関数、、piまたはがありませんe。作るために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うわー、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 Complex numbers FTW :-)
ルイスメンドー

5

Grasshopper、25プリミティブ(11コンポーネント、14ワイヤー)

GHとLabVIEWのプログラムに関するメタ投稿を読み、同様の指示に従って視覚言語を測定します。

バッタプログラム

<null>N = 0, 1, 2で印刷Polygon Primitiveすると、エッジが2つ以下のポリゴンを生成できず、空の行リストが取得されるためです。

左から右へのコンポーネント:

  • Side count スライダー:入力
  • ポリゴンプリミティブ:キャンバスにポリゴンを描画します
  • 分解:ポリラインを分解して頂点に分解します
  • 相互参照:すべての頂点間の全体的な相互参照を作成します
  • 線:すべてのペアの間に線を引きます
  • 重複行を削除
  • 曲線の長さ
  • (上)合計
  • (下)分割:Polygon Primitive半径に基づいてポリゴンを描画するため、形状を拡大縮小する必要があります
  • マルチピケーション
  • パネル:出力

サイのスクリーンショット



2

ハスケル、27バイト

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

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

私はHaskellに飛び込んだので、これは公平な初心者のゴルフであることがわかりました(つまり、他の答えから式をコピーします)。

また$、どこかに置くように努力しましたが、コンパイラは私に怒鳴り続けているので、これは私が持っている最高のものです。:P


2

ゼリー13 12 11バイト

ジョナサンアランの式を使用します(2バイトの節約に感謝します)

ØP÷ÆẠCḤɓ’ȧ÷

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

私はいつもゼリーにかなり魅了されてきましたが、あまり使いませんでしたので、これは最も単純な形ではないかもしれません。


、「二項の鎖分離を交換引数」を使って、バイトの保存ɓ:ので、あなたのようなヘルパーのリンクをインライン化するために、ØP÷ÆẠCḤɓn1×÷
ジョナサン・アラン

@ジョナサンアランああありがとう、私はまだ初心者であり、おそらく新しいチェーンを持っているよりも良い方法があると知っていましたが、それを行う方法を知りませんでした
-Jeffmagma

ああ、私たちは、デクリメントを使用して別のを保存することができ、かつ論理と、ȧØP÷ÆẠCḤɓ’ȧ÷:)
ジョナサン・アラン

ああすごいありがとう、私はそれを考えていなかった
ジェフマグマ

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>

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