Köşe Bağlantılarını Topla


14

Diyelim ki pozitif bir tamsayı N'ye sahipsin . İlk olarak, komşu köşeler arasındaki mesafe 1 olacak şekilde N köşeleri olan düzenli bir çokgen oluşturun . Sonra her köşeden çizgileri diğer köşelere bağlayın. Son olarak, birlikte toplanan tüm satırların uzunluğunu hesaplayın.

Misal

N = 6 girişi verildiğinde, her tepe noktasını diğer köşelere bağlayan çizgileri olan bir altıgen oluşturun.

Altıgen

Gördüğünüz gibi, toplam 6 sınır çizgisi (uzunluk = 1), sınır uzunluğunun iki katı (uzunluk = 2) olan 3 satır ve Pisagor Teoremi'ni kullanarak için hesaplayabileceğimiz 6 satır daha var. , hangisi

Çizgilerin uzunluklarını birlikte eklersek (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392 elde ederiz .

ek bilgi

2 veya daha az köşesi olan yapılar çokgen olarak kabul NaNedilmediğinden, N = 1 için çıkış 0 (veya tek bir tepe arasındaki mesafe pek mantıklı olmadığından), çünkü tek bir köşe diğer köşelere bağlanamaz ve 1 N = 2, çünkü iki köşe tek bir çizgi ile bağlanır.

Giriş

Herhangi bir makul formatta bir tamsayı N.

Çıktı

Bir araya toplanan tüm satırların uzunluğu, işlev dönüşü olarak veya doğrudan yazdırılan en az 3 ondalık basamağa kadar doğrudur stdout.

kurallar

  • Standart boşluklar yasaktır.
  • Bu , bu nedenle herhangi bir dilde bayttaki en kısa kod kazanır.

İyi şanslar!

Test Durumları

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

1
Gerçekten halletmeli 1miyiz? Geçerli girişim nanörneğin sıfır yerine geri dönecek ve bunun için özel bir kasa gerektirecekti.
Jonathan Allan

1
@JonathanAllan Cevabınızı gördükten sonra düşündüm nan, tek bir tepe arasındaki mesafe zaten çok mantıklı olmadığı için de iyi.
Ian H.

6
Sanırım muhtemelen hataların da atılmasına izin vermelisiniz n=1.
Jonathan Allan

Üst sınır olmadan 3 ondalık doğruluk noktasının ne anlama geldiğini söylemek zordur N, çünkü çıktılar büyür ve şamandıralar daha az hassas olur.
xnor

@xnor Herhangi bir makul giriş N için 3 ondalık basamağa kadar kesin olduğu sürece, bunun sonucu büyük sonuçlar için daha az kesindir .
Ian H.

Yanıtlar:


13

Python 3 ( senfoni ile ) ,  61 60 58 54  48 bayt

Xnor (daha fazla trigonometrik basitleştirme artı 1 kenarını işlemek ve (artık gereksiz) bir alçı taşıyarak parantezleri kaydetmek için daha fazla golf n=1) sayesinde -6 (belki de ele almamız gerekmiyorsa -10 ).float

Umarım 3. parti kütüphaneleri olmadan yenilebilir mi? Evet!! ama işlerin yoluna girelim ...

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

Çevrimiçi deneyin!

Bu, bir birim çemberin içine bir çokgen eklenmişse uzunlukların toplamı için bir formül kullanır n*cot(pi/2/n)/2ve sonucu, bu kordon uzunluğunun günahına bölerek yan uzunluk bir olan için bire ayarlar sin(pi/n).

İlk formül, n-1bir köşeden yayılan tüm köşegenlerin sin(pi/n)(yine) sin(2*pi/n),, ..., kordon uzunlukları dikkate alınarak elde edilir sin((n-1)pi/n). Bunun toplamı, köşeler cot(pi/2/n)var, nbu yüzden çarpıyoruz n, ama sonra tüm kabloları iki kez saydık, bu yüzden ikiye bölüyoruz.

Ortaya çıkan sonuç n*cot(pi/2/n)/2/sin(pi/n)daha sonra xnor ile n/2/(1-cos(pi/n))(tutma n>1) basitleştirildi

... bu (doğruluk kabul edilebilir olduğu sürece) artık sympyyerleşik mathmodül ( math.pi=3.141592653589793) için artık gerekli değildir .


2
Evet! 11 bayt kaydedildi. harika formül!
J42161217

1
Formül basitleşiyor gibi görünüyor n/2/(1-cos(pi/n)).
xnor

(Madem çıkış may olarak iyi nokta @xnor 0.25için n=1- ama özel kablosunun çok kısa olabilir ...)
Jonathan Allan

@JonathanAllan Huh, 1/4bunun sonucu garip n=1. İle yamanabilir 1%n*. Ayrıca, parens floatiçeriye taşınarak kaydedilebilir float(1-cos(pi/n)). Çok fazla sempozyum bilmiyorum ama belki de bir şamandırayı zorlamanın aritmetik bir yolu var.
xnor

@xnor Teşekkürler! ( floatHareketi fark etmeliydim ). sympy bir ifade verir - örneğin, n=6temsil edilen bir ifadede hiçbir döküm sonucu olmaması için 3.0/(-sqrt(3)/2 + 1)- daha kısa bir yol olabilir, ancak henüz bilmiyorum.
Jonathan Allan

7

Python , 34 bayt

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

Çevrimiçi deneyin!

Jonathan Allan'dann/2/(1-cos(pi/n)) basitleştirilmiş formülü kullanır . Neil, Python'un birlik köklerini kesirli güçler olarak hesaplayabildiğini belirterek 10 bayt kurtardı .1j

İçe aktarılmamış Python'un yerleşik trigonometrik işlevleri yoktur pi, veya e. Daha ziyade n=1vermek 0yerine 0.25, biz başlıyoruz 1%n*.

Yalnızca doğal sayı güçlerini kullanan daha uzun bir sürüm:

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

Çevrimiçi deneyin!


1
Salatalık gibi serin.
Jonathan Allan

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

@Neil Wow, Python sadece birlik köklerini hesaplayabilir.
xnor

Kolay işti bu. abs()Ama ne yaptığını bilmiyorum .
Neil

@Neil mutlak değeri, dolayısıyla normu, yani başlangıç ​​noktasına olan mesafeyi alır.
Jonathan Allan

6

MATL , 16 15 bayt

t:=ZF&-|Rst2)/s

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

Bu , FFT (Hızlı Fourier Dönüşümü) işlevini tanıtan ve mücadeleyi 8 gün öncesinden önce tutan bir taahhüt kullanır .

açıklama

Kod , birliğin köklerini oluşturmak için bu hileyi (MATL'ye uyarlanmış) kullanır. Bunlar, ardışık köşeler arasındaki mesafenin 1'e normalleştirilmemesi dışında, köşelerin konumlarını karmaşık sayılar olarak verir. Bunu çözmek için, tüm çift mesafeleri hesapladıktan sonra, program bunları birbirini izleyen köşeler arasındaki mesafeye böler.

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
bu güzel
Jonah

@Jonah Karmaşık sayılar FTW :-)
Luis Mendo

5

Çekirge, 25 ilkel (11 bileşen, 14 tel)

GH ve LabVIEW'daki programlar hakkında bir meta yayın okudum ve görsel bir dili ölçmek için benzer talimatları takip ediyorum.

çekirge programı

<null>N = için yazdır 0, 1, 2, çünkü Polygon Primitive2 veya daha az kenarlı bir çokgen oluşturamazsınız ve boş bir satır listesi alırsınız.

Soldan sağa bileşenler:

  • Side count kaydırıcı: giriş
  • Çokgen İlkel: tuval üzerine çokgen çizin
  • Patlat: Bir çoklu çizgiyi parçalara ve köşelere patlatır
  • Çapraz referans: tüm köşeler arasında bütünsel çapraz referans oluşturun
  • Çizgi: tüm çiftler arasında bir çizgi çiz
  • Yinelenen Satırları Sil
  • Eğri uzunluğu
  • (üst) Toplam
  • (alt) Bölüm: çünkü Polygon Primitiveyarıçapa dayalı çokgen çizer, şekli ölçeklendirmeliyiz
  • Multipication
  • Panel: çıktı

gergedan ekran görüntüsü



2

Haskell , 27 bayt

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

Çevrimiçi deneyin!

Sadece Haskell'e girdim, bu yüzden bu adil bir başlangıç ​​golfü (yani, diğer cevaplardan formülü kopyalamak) ortaya çıkıyor.

Ben de bir $yere koymak için çok çalıştım ama derleyici bana bağırmaya devam ediyor, bu yüzden bu benim en iyisi. : P


2

Jöle , 13 12 11 bayt

Jonathan Allan'ın formülünü kullanır (ve 2 bayt kazandığı için ona teşekkür eder)

ØP÷ÆẠCḤɓ’ȧ÷

Çevrimiçi deneyin!

Jelly'den her zaman oldukça etkilendim, ancak çok fazla kullanmadım, bu yüzden bu en basit form olmayabilir.


ɓYardımcı bağlantınızı bu şekilde satır içine almak için "ikili zincir ayırmasını değiştiren argüman" kullanarak bir bayt kaydedin:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan

@JonathanAllan oh teşekkürler, hala bir acemiyim ve muhtemelen yeni bir zincire sahip olmaktan daha iyi bir yol olduğunu biliyordum ama nasıl yapılacağını bilmiyordum
Jeffmagma

Ah, biz eksiltme, kullanarak başka kaydedebilirsiniz ve mantıksal-ve ȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan

oh vay teşekkürler bunu düşünmemiştim
Jeffmagma

1

Javascript (ES6), 36 bayt

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

Bağlantı noktası @ JonathanAllan's Python 3 cevap

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.