La forma N-Dimensional más simple que se puede crear para cualquier dimensión es un Simplex , y este es un conjunto de N + 1 puntos que están a la misma distancia entre sí.
Para 2 dimensiones, este es un triángulo equilátero, para 3 dimensiones, este es un tetraedro regular, en 4 dimensiones es la celda 5 y así sucesivamente.
El reto
Dada una dimensión entera N como entrada, genera una matriz / lista / pila / lo que sea de N puntos dimensionales que representan un simplex de esta dimensión. Es decir, N + 1 vértices que son iguales y distintos de cero entre sí.
Implementación de referencia en Lua
Ejemplos
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...]]
Notas
- La entrada es un número en cualquier formato estándar , y siempre será un número entero mayor que 1 y menor que 10
- Se permite la codificación rígida para la entrada de 1, pero nada más alto.
- Se permite un error razonable en la salida. Los problemas con la aritmética de coma flotante o trigonometría pueden ignorarse.
- Se permite cualquier transformación del simplex N dimensional, siempre y cuando siga siendo Regular y No cero.
- Las lagunas estándar están prohibidas.
- Este es el código de golf , por lo que gana menos bytes.
code-golf
arithmetic
Un taco
fuente
fuente
Respuestas:
Jalea , 11 bytes
Pruébalo en línea!
Obras de la generación de la matriz identidad de tamaño N y concatenar con la lista generada repitiendo N veces el singleton √ (N + 1) + 1 , divididos por N .
fuente
Python
7866 BytesSeguramente se puede mejorar,
especialmente en el manejo de n = 1 '' '. (¿Cómo es eso incluso un simplex?)Acabo de darme cuenta de que no es necesario. Probablemente se pueda mejorar aún ^^Pruébalo en línea!
[i*[0]+[1]+(n+~i)*[0]for i in range(n)]
crea una matriz de identidad. Todos los puntos tienen distanciasqrt(2)
unos de otros. (gracias a Rod por mejorar)Ahora necesitamos un
n+1
enésimo punto con la misma distancia a todos los demás puntos. Tenemos que elegir(x, x, ... x)
.Distancia de
(1, 0, ... )
a(x, x, ... x)
essqrt((x-1)²+x²+...+x²)
. Si queremos unn
simplex dimensional, resulta sersqrt((x-1)²+(n-1)x²)
, ya que tenemos uno1
yn-1
0
s en el primer punto. Simplifica un poco:sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)
Queremos que esta distancia sea
sqrt(2)
.sqrt(2) = sqrt(nx²-2x+1)
2 = nx²-2x+1
0 = nx²-2x-1
0 = x²-2/n*x+1/n
Resolviendo esta ecuación cuadrática (una solución, otra funciona bien también):
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
Ponga eso en una lista de
n
tiempos, ponga esa lista en una lista y únase a la matriz de identidad.-4 Bytes gracias a Alex Varga:
Multiplica cada vector por
n
. Esto cambia la creación de la matriz de identidad alambda n:[i*[0]+[n]+(n+~i)*[0]
(la misma longitud) y elimina la división porn
en el punto adicional, por lo que se convierten*[1+(n+1)**.5]
, guardando dos corchetes y el/n
.fuente
Wolfram Language (Mathematica) , 46 bytes
Pruébalo en línea!
fuente
APL (Dyalog) ,
2018 bytes1 byte gracias a @ngn
Pruébalo en línea!
fuente
(∘.=⍨⍳)
->∘.=⍨∘⍳
⌹
, pero no puedo bastante averiguar cómo podría funcionar ...{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
JavaScript (ES7), 70 bytes
Puerto de la respuesta Python de @ PattuX.
fuente
Wolfram Language (Mathematica), 205 bytes
Función simplex en Mathematica Comenzando desde
{0,0,...]},{1,0,0,...]}
, Colocando el primer punto en el origen, Segundo punto en elx
eje Tercer punto en elx,y
plano, Cuarto punto en elx,y,z
espacio, etc. Esta progresión reutiliza todos los puntos anteriores, agregando un nuevo punto a la vez en una nueva dimensiónVerificación
fuente
Octava , 31 bytes
Guardado 2 bytes gracias a Luis Mendo .
Pruébalo en línea!
fuente
ones(1,n)
por~~(1:n)
Ruby , 55 bytes
en lugar de devolver magnitudes similares para todas las dimensiones y usar la fórmula
(1+(n+1)**0.5)/n
escalo por un factor den
simplificar la fórmula para(1+(n+1)**0.5)
Pruébalo en línea!
sin golf en el programa de prueba
Una función lambda que toma
n
como argumento y devuelve una matriz de matrices.salida
fuente
Pari / GP , 37 bytes
Pruébalo en línea!
fuente
R , 38 bytes
Pruébalo en línea!
fuente