Summieren Sie die Vertex-Verbindungen

14

Angenommen , Sie haben eine positive ganze Zahl haben N . Erstellen Sie zunächst ein reguläres Polygon mit N Eckpunkten, wobei der Abstand zwischen benachbarten Eckpunkten 1 beträgt. Verbinden Sie dann die Linien von jedem Eckpunkt mit jedem anderen Eckpunkt. Zuletzt berechnen Sie die Länge aller zusammengezählten Zeilen.

Beispiel

Erstellen Sie unter der Annahme, dass die Eingabe N = 6 ist, ein Sechseck mit Linien, die jeden Scheitelpunkt mit den anderen Scheitelpunkten verbinden.

Hexagon

Wie Sie sehen, gibt es insgesamt 6 Grenzlinien (Länge = 1), 3 Linien mit der doppelten Grenzlänge (Länge = 2) und 6 andere Linien, für die wir mit dem Satz von Pythagoras die Länge berechnen können , welches ist

Wenn wir die Längen der Linien addieren, erhalten wir (6 * 1) + (3 * 2) + (6 * 1,732) = 22,392 .

zusätzliche Information

Da Strukturen mit 2 oder weniger Scheitelpunkten nicht als Polygone betrachtet werden, geben Sie NaNfür N = 1 0 (oder , da der Abstand zwischen einem einzelnen Scheitelpunkt wenig Sinn macht) aus, da ein einzelner Scheitelpunkt nicht mit anderen Scheitelpunkten verbunden werden kann, und für 1 N = 2, da zwei Eckpunkte durch eine einzige Linie verbunden sind.

Eingang

Eine ganze Zahl N in einem beliebigen vernünftigen Format.

Ausgabe

Die Länge aller Zeilen, summiert auf mindestens 3 Dezimalstellen genau, entweder als Funktionsrückgabe oder direkt aufgedruckt stdout.

Regeln

  • Standardlücken sind verboten.
  • Das ist , also gewinnt der kürzeste Code in Bytes in jeder Sprache.

Viel Glück!

Testfälle

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392
Ian H.
quelle
1
Müssen wir wirklich damit umgehen 1? Mein aktueller Eintrag würde nanzum Beispiel eher als Null zurückkehren und würde nur ein spezielles Gehäuse dafür erfordern.
Jonathan Allan
1
@ JonathanAllan Ich habe darüber nachgedacht, nachdem ich Ihre Antwort gesehen habe. Das nanist auch in Ordnung, da die Entfernung zwischen einem einzelnen Scheitelpunkt sowieso nicht viel Sinn macht.
Ian H.
6
Sie sollten wahrscheinlich zulassen, dass auch Fehler ausgegeben werden, n=1denke ich.
Jonathan Allan
Es ist schwer zu sagen, was 3 Dezimalstellen Genauigkeit ohne Obergrenze bedeuten N, da die Ausgaben größer und die Gleitkommazahlen ungenauer werden.
23.
@xnor Solange eine sinnvolle Eingabe N bis zu 3 Dezimalstellen genau ist, ist das Ergebnis für große Zahlen weniger genau.
Ian H.

Antworten:

13

Python 3 (mit Sympy ) ,  61 60 58 54  48 Bytes

-6 (vielleicht sogar -10, wenn wir nicht damit umgehen müssen n=1) dank xnor (weitere trigonometrische Vereinfachung plus weiteres Golfen, um den Kantenfall 1 zu handhaben und Klammern zu speichern, indem ein (jetzt nicht mehr erforderlicher ) Wurf verschoben wirdfloat ).

Hoffentlich ohne Bibliotheken von Drittanbietern zu schlagen? Ja!! aber lasst uns die Dinge ins Rollen bringen ...

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

Probieren Sie es online!

Dies verwendet eine Formel für die Summe der Längen, wenn ein Polygon innerhalb eines Einheitskreises eingeschrieben ist, n*cot(pi/2/n)/2und passt das Ergebnis auf eins an, wenn die Seitenlänge eins ist, indem durch die Sünde dieser Kordlänge dividiert wird sin(pi/n).

Die erste Formel ergibt sich aus der Betrachtung der n-1Kordlängen aller Diagonalen, die von einer Ecke ausgehen und sin(pi/n)(wieder) ,, sin(2*pi/n)..., sin((n-1)pi/n). Die Summe davon ist cot(pi/2/n), dass es nEcken gibt, mit denen wir multiplizieren n, aber dann haben wir alle Schnüre doppelt gezählt, sodass wir durch zwei teilen.

Das Ergebnis n*cot(pi/2/n)/2/sin(pi/n)wurde dann durch xnor auf n/2/(1-cos(pi/n))(Halten für n>1) vereinfacht.

... dies (solange die Genauigkeit akzeptabel ist) erfordert nun nicht mehr sympyüber das eingebaute mathModul ( math.pi=3.141592653589793).

Jonathan Allan
quelle
2
Ja! 11 Bytes gespeichert. coole Formel!
J42161217
1
Es sieht aus wie die Formel vereinfacht n/2/(1-cos(pi/n)).
23.
Guter Ort @xnor (so lange , wie wir ausgeben 0.25für n=1- aber spezielles Gehäuse kann kürzer sein ...)
Jonathan Allan
@ JonathanAllan Huh, komisch, das 1/4ist das Ergebnis für n=1. Es kann mit gepatcht werden 1%n*. Außerdem können durch Verschieben der floatInnenseite nach Parens gespeichert werden float(1-cos(pi/n)). Ich weiß nicht viel über Sympy, aber vielleicht gibt es eine arithmetische Methode, um einen Float zu erzwingen.
23.
@ xnor Danke! (Ich hätte den floatUmzug bemerken sollen ). sympy gibt einen Ausdruck aus - z. B. wenn n=6keine Besetzung zu einem Ausdruck mit einer Darstellung führt 3.0/(-sqrt(3)/2 + 1)- es mag einen kürzeren Weg geben, aber ich weiß es noch nicht.
Jonathan Allan
7

Python , 34 Bytes

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

Probieren Sie es online!

Verwendet die von Jonathan Allann/2/(1-cos(pi/n)) vereinfachte Formel . Neil sparte 10 Bytes, indem er feststellte, dass Python Wurzeln der Einheit als Teilkräfte von berechnen kann .1j

Python ohne Import verfügt nicht über integrierte trigonometrische Funktionen pi, oder e. Um lieber n=1geben 0als machen 0.25, stellen wir voran 1%n*.

Eine längere Version, die nur Potenzen mit natürlichen Zahlen verwendet:

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

Probieren Sie es online!

xnor
quelle
1
Wörtlich: kalt wie eine Gurke; sinngemäß: kalt wie Eis.
Jonathan Allan
37 Bytes:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil
@Neil Wow, Python kann nur Wurzeln der Einheit berechnen.
Xnor
Nun, das war das leichte Stück. Ich weiß aber nicht was abs().
Neil
@Neil es wird der absolute Wert, also die Norm, dh der Abstand vom Ursprung.
Jonathan Allan
6

MATL , 16 15 Bytes

t:=ZF&-|Rst2)/s

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Hierbei wird ein Commit verwendet , mit dem die FFT-Funktion (Fast Fourier Transform) eingeführt wurde und das der Herausforderung um 8 Tage vorausgeht.

Erläuterung

Der Code verwendet diesen Trick (angepasst an MATL), um die Wurzeln der Einheit zu erzeugen. Diese geben die Positionen der Scheitelpunkte als komplexe Zahlen an, mit der Ausnahme, dass der Abstand zwischen aufeinanderfolgenden Scheitelpunkten nicht auf 1 normiert ist. Um dies zu lösen, dividiert das Programm nach Berechnung aller paarweisen Abstände diese durch den Abstand zwischen aufeinanderfolgenden Scheitelpunkten.

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
quelle
1
Das ist wunderschön
Jonah
@Jonah Komplexe Zahlen FTW :-)
Luis Mendo
5

Heuschrecke, 25 Grundelemente (11 Komponenten, 14 Drähte)

Ich habe einen Metapost über Programme in GH und LabVIEW gelesen und folge ähnlichen Anweisungen, um eine visuelle Sprache zu messen.

Heuschreckenprogramm

Drucken Sie <null>für N = 0, 1, 2, da Polygon Primitivekein Polygon mit 2 oder weniger Kanten generiert werden kann und Sie eine leere Zeilenliste erhalten.

Komponenten von links nach rechts:

  • Side count Schieberegler: Eingabe
  • Polygon-Grundelement: Zeichnen Sie ein Polygon auf die Leinwand
  • Explodieren: Zerlegen Sie eine Polylinie in Segmente und Scheitelpunkte
  • Querverweis: Erstellen Sie einen ganzheitlichen Querverweis zwischen allen Eckpunkten
  • Linie: Zeichnen Sie eine Linie zwischen allen Paaren
  • Doppelte Zeilen löschen
  • Länge der Kurve
  • (obere) Summe
  • (untere) Abteilung: weil Polygon Primitive Polygone basierend auf dem Radius gezeichnet werden, müssen wir die Form skalieren
  • Multiplikation
  • Panel: Ausgabe

Nashorn-Screenshot

Keyu Gan
quelle
4

Mathematica, 26 Bytes

verwendet die Formel von Jonathan Allan

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

Probieren Sie es online!

-1 Byte Junghwan min

J42161217
quelle
-1 Byte: N@Cot[Pi/2/#]/2Csc[Pi/#]#&seit1/sin(x) = csc(x)
JungHwan Min 23.10.17
2
.5Csc[x=Pi/#]Cot[x/2]#&
Mischa Lawrow
2

Haskell , 27 Bytes

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

Probieren Sie es online!

Ich bin gerade in Haskell eingetaucht, daher stellt sich heraus, dass dies ein fairer Anfänger Golf ist (das heißt, die Formel von anderen Antworten zu kopieren).

Ich habe mich auch sehr bemüht, $irgendwohin zu kommen, aber der Compiler brüllt mich weiter an, also ist dies das Beste, was ich habe. : P

total menschlich
quelle
2

Jelly , 13 12 11 Bytes

Verwendet die Formel von Jonathan Allan (und danke ihm, dass er 2 Bytes gespart hat)

ØP÷ÆẠCḤɓ’ȧ÷

Probieren Sie es online!

Ich war schon immer ziemlich fasziniert von Jelly, habe es aber nicht oft benutzt, daher ist dies möglicherweise nicht die einfachste Form.

Jeffmagma
quelle
Speichern Sie ein Byte, indem Sie "argument swapping dyadic chain disconnection" verwenden, ɓum Ihr Hilfsglied wie folgt inline zu setzen:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan
@ JonathanAllan oh danke, ich bin noch ein Anfänger und wusste, dass es wahrscheinlich einen besseren Weg als eine neue Kette gibt, wusste aber nicht, wie es geht
Jeffmagma
Oh, wir können ein anderes retten, indem wir decrement, und logical-and verwenden ȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan
oh wow danke daran hatte ich nicht gedacht
Jeffmagma
1

Javascript (ES6), 36 Byte

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

Port von @ JonathanAllans Python 3 Antwort

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
quelle