Die einfachste N-dimensionale Form, die für jede Dimension erstellt werden kann, ist ein Simplex . Hierbei handelt es sich um eine Menge von N + 1 Punkten, die alle gleich weit voneinander entfernt sind.
Bei 2 Dimensionen ist dies ein gleichseitiges Dreieck, bei 3 Dimensionen ist dies ein regulärer Tetraeder, bei 4 Dimensionen ist das 5-Zellen- Dreieck und so weiter.
Die Herausforderung
Wenn Sie eine Ganzzahldimension N als Eingabe angeben, geben Sie ein Array / eine Liste / einen Stapel / beliebige N-dimensionale Punkte aus, die einen Simplex dieser Dimension darstellen. Das heißt, N + 1 Scheitelpunkte, die gleich und ungleich Null voneinander entfernt sind.
Referenzimplementierung in Lua
Beispiele
1 -> [[0], [1]]
2 -> [[0, 0], [1, 0], [0.5, 0.866...]]
4 -> [[0, 0, 0, 0], [1, 0, 0, 0], [0.5, 0.866..., 0, 0], [0.5, 0.288..., 0.816..., 0], [0.5, 0.288..., 0.204..., 0.790...]]
Anmerkungen
- Die Eingabe ist eine Zahl in einem beliebigen Standardformat und wird immer eine ganze Zahl größer als 1 und kleiner als 10 sein
- Hardcoding ist für die Eingabe von 1 zulässig, jedoch nicht höher.
- Angemessener Fehler ist in der Ausgabe zulässig. Probleme mit Gleitkomma-Arithmetik oder Trigger können ignoriert werden.
- Jede Transformation des N-dimensionalen Simplex ist zulässig, solange sie regelmäßig und nicht null bleibt.
- Standardlücken sind verboten.
- Das ist Code-Golf , also gewinnen die wenigsten Bytes.
code-golf
arithmetic
Ein Taco
quelle
quelle
Antworten:
Gelee , 11 Bytes
Probieren Sie es online!
Generiert die Identitätsmatrix der Größe N und verknüpft sie mit der Liste, die durch N- maliges Wiederholen des Singleton √ (N + 1) + 1 geteilt durch N generiert wurde .
quelle
Python
7866 BytesKann sicherlich verbessert werden,
insbesondere bei der Handhabung von n = 1```. (Wie ist das überhaupt ein Simplex?)Nur gemerkt, dass das nicht nötig ist. Kann wohl noch verbessert werden ^^Probieren Sie es online!
[i*[0]+[1]+(n+~i)*[0]for i in range(n)]
schafft Identitätsmatrix. Alle Punkte haben Distanzsqrt(2)
voneinander. (Danke an Rod für die Verbesserung)Jetzt brauchen wir einen
n+1
-ten Punkt mit dem gleichen Abstand zu allen anderen Punkten. Wir müssen uns entscheiden(x, x, ... x)
.Entfernung von
(1, 0, ... )
bis(x, x, ... x)
istsqrt((x-1)²+x²+...+x²)
. Wenn wir einenn
dimensionalen Simplex wollen, stellt sich heraus, dass dies so istsqrt((x-1)²+(n-1)x²)
, wie wir einen1
und habenn-1
0
s in den ersten Punkt. Vereinfachen Sie ein bisschen:sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)
Wir wollen, dass diese Distanz ist
sqrt(2)
.sqrt(2) = sqrt(nx²-2x+1)
2 = nx²-2x+1
0 = nx²-2x-1
0 = x²-2/n*x+1/n
Lösen Sie diese quadratische Gleichung (eine Lösung, die andere funktioniert auch):
x = 1/n+sqrt(1/n²+1/n) = 1/n+sqrt((n+1)/n²) = 1/n+sqrt(n+1)/n = (1+sqrt(n+1))/n
Schreiben Sie das
n
mal in eine Liste , schreiben Sie diese Liste in eine Liste und verbinden Sie sich mit der Identitätsmatrix.-4 Bytes dank Alex Varga:
Multiplizieren Sie jeden Vektor mit
n
. Dies ändert die Erstellung der Identitätsmatrix auflambda n:[i*[0]+[n]+(n+~i)*[0]
(gleiche Länge) und beseitigt die Teilung durchn
im zusätzlichen Punkt, so dassn*[1+(n+1)**.5]
zwei Klammern und die/n
.quelle
Wolfram Language (Mathematica) , 46 Byte
Probieren Sie es online!
quelle
APL (Dyalog) ,
20 bis18 Bytes1 Byte danke an @ngn
Probieren Sie es online!
quelle
(∘.=⍨⍳)
->∘.=⍨∘⍳
⌹
aber ich kann nicht genau herausfinden, wie es funktionieren könnte ...{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
JavaScript (ES7), 70 Byte
Port von @ PattuX's Python Antwort.
quelle
Wolfram Language (Mathematica), 205 Byte
Simplex-Funktion in Mathematica Ausgehend von
{0,0,...]},{1,0,0,...]}
Platzieren des ersten Punkts am Ursprung, des zweiten Punkts auf derx
Achse, des dritten Punkts in derx,y
Ebene, des vierten Punkts imx,y,z
Raum usw. Bei dieser Abfolge werden alle vorherigen Punkte wiederverwendet und jeweils ein neuer Punkt in einer neuen Dimension hinzugefügtNachprüfung
quelle
Oktave , 31 Bytes
2 Bytes dank Luis Mendo gespeichert .
Probieren Sie es online!
quelle
ones(1,n)
durch~~(1:n)
Ruby , 55 Bytes
anstatt für alle Dimensionen ähnliche Beträge zurückzugeben und die Formel
(1+(n+1)**0.5)/n
In
um den Faktor 1 zu vergrößern, um die Formel zu vereinfachen(1+(n+1)**0.5)
Probieren Sie es online!
im Testprogramm ungolfed
Eine Lambda-Funktion, die
n
als Argument ein Array von Arrays zurückgibt.Ausgabe
quelle
Pari / GP , 37 Bytes
Probieren Sie es online!
quelle
R , 38 Bytes
Probieren Sie es online!
quelle