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.
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 kode-golf , 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
1
? Entri saya saat ini akan kembalinan
daripada nol misalnya, dan hanya akan membutuhkan casing khusus untuk itu.nan
juga baik-baik saja, karena jarak antara satu titik tidak masuk akal.n=1
saya pikir.N
, karena output menjadi lebih besar dan mengapung menjadi kurang tepat.Jawaban:
Python 3
(dengan sympy ),61 60 58 5448 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 bisadikalahkan tanpa perpustakaanpihak ke-3? Iya!!tapimari kita mulai ...Cobalah online!
Ini menggunakan rumus untuk jumlah panjang jika poligon tertulis di dalam lingkaran satuan,
n*cot(pi/2/n)/2
dan menyesuaikan hasilnya menjadi satu untuk panjang sisi menjadi satu dengan membaginya dengan dosa panjang kabelnyasin(pi/n)
.Formula pertama diperoleh dengan mempertimbangkan
n-1
panjang kabel dari semua diagonal yang berasal dari satu sudut yang memiliki panjangsin(pi/n)
(lagi)sin(2*pi/n)
,, ...,sin((n-1)pi/n)
. Jumlahnya adalahcot(pi/2/n)
, adan
sudut sehingga kita mengalikannyan
, 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 ken/2/(1-cos(pi/n))
(holding forn>1
)... ini (asalkan akurasi yang dapat diterima) sekarang tidak lagi memerlukan
sympy
lebih built-inmath
modul (math.pi=3.141592653589793
).sumber
n/2/(1-cos(pi/n))
.0.25
untukn=1
- tetapi casing khusus mungkin lebih pendek juga ...)1/4
hasilnya untukn=1
. Dapat ditambal dengan1%n*
. Selain itu, parens dapat disimpan dengan memindahkan bagianfloat
dalam kefloat(1-cos(pi/n))
. Saya tidak tahu banyak tentang sympy, tapi mungkin ada cara aritmatika untuk memaksa pelampung.float
langkahnya). sympy menampilkan ekspresi - misalnyan=6
tanpa hasil pemeran dalam ekspresi dengan representasi3.0/(-sqrt(3)/2 + 1)
- mungkin ada cara yang lebih pendek tapi saya belum mengetahuinya.Python , 34 byte
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 fraksional1j
.Python tanpa impor tidak memiliki fungsi trigonometri bawaan
pi
,, ataue
. Untukn=1
memberi0
daripada memberi0.25
, kami menambahkan1%n*
.Versi yang lebih panjang hanya menggunakan kekuatan bilangan alami:
Cobalah online!
sumber
lambda n:1%n*n/(1-(1j**(2/n)).real)/2
abs()
terjadi.MATL ,
1615 byteCobalah 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.
sumber
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.
Cetak
<null>
untuk N =0, 1, 2
, karenaPolygon Primitive
tidak dapat menghasilkan poligon dengan 2 atau lebih sedikit tepi dan Anda akan mendapatkan daftar garis kosong.Komponen dari kiri ke kanan:
Side count
slider: inputPolygon Primitive
menggambar poligon berdasarkan jari-jari, kita perlu skala bentuksumber
Mathematica, 26 byte
menggunakan formula @Jonathan Allan
Cobalah online!
-1 byte junghwan min
sumber
N@Cot[Pi/2/#]/2Csc[Pi/#]#&
sejak1/sin(x) = csc(x)
.5Csc[x=Pi/#]Cot[x/2]#&
Haskell , 27 byte
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. : Psumber
Jelly ,
131211 byteMenggunakan formula Jonathan Allan (dan terima kasih padanya untuk menghemat 2 byte)
Cobalah online!
Saya selalu cukup terpesona dengan Jelly, tetapi belum sering menggunakannya, jadi ini mungkin bukan bentuk yang paling sederhana.
sumber
ɓ
, untuk inline tautan pembantu Anda seperti:ØP÷ÆẠCḤɓn1×÷
’
, dan logis-dan,ȧ
:ØP÷ÆẠCḤɓ’ȧ÷
:)Javascript (ES6), 36 byte
Port of @ JonathanAllan's Python 3 menjawab
sumber