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.
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 NaN
fü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 Code-Golf , 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
1
? Mein aktueller Eintrag würdenan
zum Beispiel eher als Null zurückkehren und würde nur ein spezielles Gehäuse dafür erfordern.nan
ist auch in Ordnung, da die Entfernung zwischen einem einzelnen Scheitelpunkt sowieso nicht viel Sinn macht.n=1
denke ich.N
, da die Ausgaben größer und die Gleitkommazahlen ungenauer werden.Antworten:
Python 3
(mit Sympy ),61 60 58 5448 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
).Hoffentlichohne Bibliotheken vonDrittanbietern zuschlagen? Ja!!aberlasst uns die Dinge ins Rollen bringen ...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)/2
und passt das Ergebnis auf eins an, wenn die Seitenlänge eins ist, indem durch die Sünde dieser Kordlänge dividiert wirdsin(pi/n)
.Die erste Formel ergibt sich aus der Betrachtung der
n-1
Kordlängen aller Diagonalen, die von einer Ecke ausgehen undsin(pi/n)
(wieder) ,,sin(2*pi/n)
...,sin((n-1)pi/n)
. Die Summe davon istcot(pi/2/n)
, dass esn
Ecken gibt, mit denen wir multiplizierenn
, 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 aufn/2/(1-cos(pi/n))
(Halten fürn>1
) vereinfacht.... dies (solange die Genauigkeit akzeptabel ist) erfordert nun nicht mehr
sympy
über das eingebautemath
Modul (math.pi=3.141592653589793
).quelle
n/2/(1-cos(pi/n))
.0.25
fürn=1
- aber spezielles Gehäuse kann kürzer sein ...)1/4
ist das Ergebnis fürn=1
. Es kann mit gepatcht werden1%n*
. Außerdem können durch Verschieben derfloat
Innenseite nach Parens gespeichert werdenfloat(1-cos(pi/n))
. Ich weiß nicht viel über Sympy, aber vielleicht gibt es eine arithmetische Methode, um einen Float zu erzwingen.float
Umzug bemerken sollen ). sympy gibt einen Ausdruck aus - z. B. wennn=6
keine Besetzung zu einem Ausdruck mit einer Darstellung führt3.0/(-sqrt(3)/2 + 1)
- es mag einen kürzeren Weg geben, aber ich weiß es noch nicht.Python , 34 Bytes
Probieren Sie es online!
Verwendet die von Jonathan Allan
n/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
, odere
. Um liebern=1
geben0
als machen0.25
, stellen wir voran1%n*
.Eine längere Version, die nur Potenzen mit natürlichen Zahlen verwendet:
Probieren Sie es online!
quelle
lambda n:1%n*n/(1-(1j**(2/n)).real)/2
abs()
.MATL ,
1615 BytesProbieren 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.
quelle
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.
Drucken Sie
<null>
für N =0, 1, 2
, daPolygon Primitive
kein Polygon mit 2 oder weniger Kanten generiert werden kann und Sie eine leere Zeilenliste erhalten.Komponenten von links nach rechts:
Side count
Schieberegler: EingabePolygon Primitive
Polygone basierend auf dem Radius gezeichnet werden, müssen wir die Form skalierenquelle
Mathematica, 26 Bytes
verwendet die Formel von Jonathan Allan
Probieren Sie es online!
-1 Byte Junghwan min
quelle
N@Cot[Pi/2/#]/2Csc[Pi/#]#&
seit1/sin(x) = csc(x)
.5Csc[x=Pi/#]Cot[x/2]#&
Haskell , 27 Bytes
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. : Pquelle
Jelly ,
131211 BytesVerwendet die Formel von Jonathan Allan (und danke ihm, dass er 2 Bytes gespart hat)
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.
quelle
ɓ
um Ihr Hilfsglied wie folgt inline zu setzen:ØP÷ÆẠCḤɓn1×÷
’
und logical-and verwendenȧ
:ØP÷ÆẠCḤɓ’ȧ÷
:)Javascript (ES6), 36 Byte
Port von @ JonathanAllans Python 3 Antwort
quelle