Jumlah Koneksi Vertex

14

Katakanlah Anda memiliki positif bilangan bulat N . Pertama, membangun reguler poligon, yang memiliki N simpul, dengan jarak antara simpul tetangga menjadi 1. garis Kemudian connect dari setiap titik, setiap vertex lainnya. Terakhir, hitung panjang semua garis yang dirangkum bersama.

Contoh

Diberikan input N = 6 , bangun heksagon dengan garis-garis yang menghubungkan setiap simpul dengan simpul lainnya.

Segi enam

Seperti yang Anda lihat, ada total 6 garis perbatasan (panjang = 1), 3 garis yang memiliki dua kali lipat panjang perbatasan (panjang = 2) dan 6 garis lain yang kita, dengan menggunakan Teorema Pythagoras, dapat menghitung panjang untuk , yang mana

Jika kita menambahkan panjang garis bersama-sama kita dapatkan (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392 .

informasi tambahan

Karena struktur dengan 2 atau kurang simpul tidak dianggap poligon, output 0 (atau NaN, karena jarak antara satu simpul tidak masuk akal) untuk N = 1, karena satu simpul tidak dapat dihubungkan ke simpul lain, dan 1 untuk N = 2, karena dua simpul dihubungkan oleh satu baris.

Memasukkan

Integer N, dalam format apa pun yang masuk akal.

Keluaran

Panjang semua garis disimpulkan bersama, akurat hingga setidaknya 3 tempat desimal, baik sebagai fungsi yang dikembalikan atau langsung dicetak stdout.

Aturan

  • Celah standar dilarang.
  • Ini adalah , jadi kode terpendek dalam byte, dalam bahasa apa pun, menang.

Semoga berhasil!

Uji Kasus

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392
Ian H.
sumber
1
Haruskah kita benar-benar menangani 1? Entri saya saat ini akan kembali nandaripada nol misalnya, dan hanya akan membutuhkan casing khusus untuk itu.
Jonathan Allan
1
@ Jonathanathan Allan Saya memikirkannya setelah melihat jawaban Anda, nanjuga baik-baik saja, karena jarak antara satu titik tidak masuk akal.
Ian H.
6
Anda mungkin harus membiarkan kesalahan untuk dilemparkan juga karena n=1saya pikir.
Jonathan Allan
Sulit untuk mengatakan apa arti 3 tempat desimal tanpa batas atas N, karena output menjadi lebih besar dan mengapung menjadi kurang tepat.
xnor
@ xnor Selama itu tepat hingga 3 tempat desimal untuk setiap input N yang masuk akal , tidak apa-apa hasilnya kurang tepat untuk angka besar.
Ian H.

Jawaban:

13

Python 3 (dengan sympy ) ,  61 60 58 54  48 byte

-6 (mungkin bahkan -10 jika kita tidak perlu menangani n=1) berkat xnor (penyederhanaan trigonometri lebih lanjut ditambah golf lebih lanjut untuk menangani case tepi 1 dan menghemat tanda kurung dengan menggerakkan pemain (yang sekarang tidak perlu) float).

Semoga bisa dikalahkan tanpa perpustakaan pihak ke-3 ? Iya!! tapi mari kita mulai ...

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

Cobalah online!

Ini menggunakan rumus untuk jumlah panjang jika poligon tertulis di dalam lingkaran satuan, n*cot(pi/2/n)/2dan menyesuaikan hasilnya menjadi satu untuk panjang sisi menjadi satu dengan membaginya dengan dosa panjang kabelnya sin(pi/n).

Formula pertama diperoleh dengan mempertimbangkan n-1panjang kabel dari semua diagonal yang berasal dari satu sudut yang memiliki panjang sin(pi/n)(lagi) sin(2*pi/n),, ..., sin((n-1)pi/n). Jumlahnya adalah cot(pi/2/n), ada nsudut sehingga kita mengalikannya n, tetapi kemudian kita telah menghitung dua kali lipat semua kabel, jadi kita membaginya menjadi dua.

Hasilnya n*cot(pi/2/n)/2/sin(pi/n)kemudian disederhanakan oleh xnor ke n/2/(1-cos(pi/n))(holding for n>1)

... ini (asalkan akurasi yang dapat diterima) sekarang tidak lagi memerlukan sympylebih built-in mathmodul ( math.pi=3.141592653589793).

Jonathan Allan
sumber
2
Iya! disimpan 11 byte. formula keren!
J42161217
1
Sepertinya rumus disederhanakan n/2/(1-cos(pi/n)).
xnor
Good spot @xnor (selama kami mungkin output 0.25untuk n=1- tetapi casing khusus mungkin lebih pendek juga ...)
Jonathan Allan
@ JonathanAllan Huh, aneh itu 1/4hasilnya untuk n=1. Dapat ditambal dengan 1%n*. Selain itu, parens dapat disimpan dengan memindahkan bagian floatdalam ke float(1-cos(pi/n)). Saya tidak tahu banyak tentang sympy, tapi mungkin ada cara aritmatika untuk memaksa pelampung.
xnor
@ Terima kasih! (Aku seharusnya memperhatikan floatlangkahnya). sympy menampilkan ekspresi - misalnya n=6tanpa hasil pemeran dalam ekspresi dengan representasi 3.0/(-sqrt(3)/2 + 1)- mungkin ada cara yang lebih pendek tapi saya belum mengetahuinya.
Jonathan Allan
7

Python , 34 byte

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

Cobalah online!

Menggunakan formula yang n/2/(1-cos(pi/n))disederhanakan dari Jonathan Allan . Neil menyelamatkan 10 byte dengan mencatat bahwa Python dapat menghitung akar persatuan sebagai kekuatan fraksional 1j.

Python tanpa impor tidak memiliki fungsi trigonometri bawaan pi,, atau e. Untuk n=1memberi 0daripada memberi 0.25, kami menambahkan 1%n*.

Versi yang lebih panjang hanya menggunakan kekuatan bilangan alami:

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

Cobalah online!

Tidak
sumber
1
Dingin seperti mentimun.
Jonathan Allan
37 byte:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil
@Neil Wow, Python hanya bisa menghitung akar persatuan.
xnor
Yah, itu agak mudah. Saya tidak tahu apa yang abs()terjadi.
Neil
@ Neil itu mendapat nilai absolut, maka norma, yaitu jarak dari titik asal.
Jonathan Allan
6

MATL , 16 15 byte

t:=ZF&-|Rst2)/s

Cobalah online! Atau verifikasi semua kasus uji .

Ini menggunakan komit yang memperkenalkan fungsi FFT (Fast Fourier Transform), dan yang mendahului tantangan dalam 8 hari.

Penjelasan

Kode menggunakan trik ini (disesuaikan dengan MATL) untuk menghasilkan akar persatuan. Ini memberikan posisi simpul sebagai bilangan kompleks, kecuali bahwa jarak antara simpul berurutan tidak dinormalisasi menjadi 1. Untuk mengatasi itu, setelah menghitung semua jarak berpasangan, program membaginya dengan jarak antara simpul berurutan.

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
Luis Mendo
sumber
1
ini indah
Yunus
@Jonah nomor Kompleks FTW :-)
Luis Mendo
5

Belalang, 25 primitif (11 komponen, 14 kabel)

Saya membaca posting meta tentang program dalam GH dan LabVIEW, dan mengikuti instruksi serupa untuk mengukur bahasa visual.

program belalang

Cetak <null>untuk N = 0, 1, 2, karena Polygon Primitivetidak dapat menghasilkan poligon dengan 2 atau lebih sedikit tepi dan Anda akan mendapatkan daftar garis kosong.

Komponen dari kiri ke kanan:

  • Side count slider: input
  • Poligon Primitif: menggambar poligon di atas kanvas
  • Meledak: Meledak polyline menjadi segmen dan simpul
  • Referensi silang: membangun referensi silang holistik antara semua simpul
  • Garis: gambar garis di antara semua pasangan
  • Hapus Garis Duplikat
  • Panjang kurva
  • (atas) Jumlah
  • (bawah) Divisi: karena Polygon Primitivemenggambar poligon berdasarkan jari-jari, kita perlu skala bentuk
  • Penggandaan
  • Panel: output

tangkapan layar badak

Keyu Gan
sumber
4

Mathematica, 26 byte

menggunakan formula @Jonathan Allan

N@Cot[Pi/2/#]/2Csc[Pi/#]#&   

Cobalah online!

-1 byte junghwan min

J42161217
sumber
-1 byte: N@Cot[Pi/2/#]/2Csc[Pi/#]#&sejak1/sin(x) = csc(x)
JungHwan Min
2
.5Csc[x=Pi/#]Cot[x/2]#&
Misha Lavrov
2

Haskell , 27 byte

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

Cobalah online!

Saya baru saja terjun ke Haskell, jadi ini ternyata golf pemula yang adil (yaitu menyalin formula dari jawaban lain).

Saya juga berusaha keras untuk meletakkannya di $suatu tempat tetapi kompiler terus meneriaki saya, jadi ini yang terbaik yang saya dapatkan. : P

benar-benar manusiawi
sumber
2

Jelly , 13 12 11 byte

Menggunakan formula Jonathan Allan (dan terima kasih padanya untuk menghemat 2 byte)

ØP÷ÆẠCḤɓ’ȧ÷

Cobalah online!

Saya selalu cukup terpesona dengan Jelly, tetapi belum sering menggunakannya, jadi ini mungkin bukan bentuk yang paling sederhana.

Jeffmagma
sumber
Simpan satu byte dengan menggunakan "argumen swapping pemisahan rantai diad" ɓ, untuk inline tautan pembantu Anda seperti:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan
@Jonathan Allan oh terima kasih, saya masih pemula dan tahu mungkin ada cara yang lebih baik daripada memiliki rantai baru tetapi tidak tahu bagaimana melakukannya
Jeffmagma
Oh, kita dapat menghemat lain dengan menggunakan penurunan, , dan logis-dan, ȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan
oh wow terima kasih aku tidak memikirkan itu
Jeffmagma
1

Javascript (ES6), 36 byte

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

Port of @ JonathanAllan's Python 3 menjawab

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>

Herman L.
sumber