Introducción
Un hipercubo / tesseract es el equivalente de 4 dimensiones de un cubo normal. Se hace tomando una red de cubos, extendiéndola a la tercera dimensión, luego, usando la cuarta dimensión, doblándola en un hipercubo. Básicamente es un cubo, donde cada lado es un cubo.
Para crear un hipercubo, necesita 16 vectores 4d (un vector con un x
, a y
, ay z
un w
componente). Estos vectores son los siguientes:
A(0, 0, 0, 0); B(1, 0, 0, 0); C(1, 0, 1, 0); D(0, 0, 1, 0); E(0, 1, 0, 0); F(1, 1, 0, 0); G(1, 1, 1, 0); H(0, 1, 1, 0);
I(0, 0, 0, 1); J(1, 0, 0, 1); K(1, 0, 1, 1); L(0, 0, 1, 1); M(0, 1, 0, 1); N(1, 1, 0, 1); O(1, 1, 1, 1); P(0, 1, 1, 1);
El hipercubo tiene 24 caras. La siguiente lista contiene todos ellos (cada grupo marca un quad):
ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP
Con toda esta información, técnicamente tiene un hipercubo en el código. Para rotar esto, necesita 6 matrices diferentes para cada plano de rotación, una para los planos YZ, XZ, XY, XW, YW y ZW. Después de tener cada matriz, debe multiplicar los vértices del cubo con ellas.
Las siguientes imágenes muestran la estructura de cada matriz:
Para la rotación en el plano YZ:
Para la rotación en el plano XZ:
Para la rotación en el plano XY:
Para la rotación en el plano XW:
Para la rotación en el plano YW:
Para la rotación en el plano ZW:
Las rotaciones se aplican en este orden.
Después de todo esto, tienes un hipercubo rotado. Ahora necesitas dibujarlo. Debe utilizar una proyección ortogonal combinado con una proyección en perspectiva para enviar (x, y, z, w)
a (2x/(2+z), 2y/(2+z))
.
Entrada
Su entrada es de 6 enteros entre 0 (inclusive) y 360 (exclusivamente). Estos representan las rotaciones en grados en los diferentes planos de rotación del hipercubo.
Salida
Su salida debe ser una sola imagen que contenga el hipercubo. La pantalla puede ser una imagen rasterizada, una imagen vectorial o un arte ASCII. La imagen de salida debe tener al menos 100 * 100 píxeles, y el cubo debe ocupar al menos el 50% de la pantalla. Se permite cualquier formato de salida de imagen predeterminado.
Casos de prueba
0 0 0 0 0 0
0 0 0 0 0 30
30 0 0 0 0 30
0 0 0 30 30 30
45 45 45 0 0 0
45 45 45 45 45 45
Abra las imágenes en una nueva pestaña para verlas en tamaño completo.
Reglas
- Aplican reglas predeterminadas
- Las lagunas estándar están prohibidas
- El código más corto en bytes gana
fuente
Respuestas:
Octava,
474433429 bytesRotado:
Las matrices de rotación aún consumen muchos bytes, pero el ciclo de Eulerian funcionó bastante bien, reduciendo el número de vértices visitados de
96120 a 33.Los vértices se generan tomando la representación binaria de 4 bits
[0:15]
y considerando que el msb es la coordenada xy el lsb la coordenada w.Editar: Multiplicar previamente todas las matrices de rotación fue una pesadilla, es por eso que no lo usé inicialmente, pero multiplicarlas previamente en pares ahorró 41 bytes.
Ahora para buscar la combinación óptima. :)Multiplicar las matrices por tres fue peor que ninguna multiplicación previa, así que estaré contento con el enfoque por pares.Salida:
fuente
Posdata
1075732683640631601590545542526514478470Utiliza mat.ps y G .
Edición: -343 Generación de codificación binaria aplicada de vectores y circuito euleriano
robadoprestado de otras respuestas. Y aplicó cadenas de tokens binarios de la biblioteca G.Editar: -49 Redefinido
sin
cos
yneg
con nombres más cortos.Editar: -43 Nombres cortos definidos para secuencias
0 0
0 1
1 0
.Editar: -9
al
(es deciraload
) es más corto que(")@
. Llamadas factorizadas a 3idi
(es deciridiv
) a costa de un no hacer nada1 idiv
.Edición: -30 Bloque de definición implícita aplicado de G.
Edición: -10 Algunas secuencias más triplicadas.
Editar: -45 Eliminar variables
i
j
k
l
m
n
para los ángulos y siempre definir el ángulo actual comot
y las funciones de los ángulos usan el valor de (global)t
variable. Aplazar la ejecución de la descripción del código de la matriz de rotación hasta que sut
valor esté listo.Editar: -3 Eliminar
<16>$
ie.closepath
. Y un espacioEditar: -16 paréntesis de matriz de factores de vectores unitarios en las matrices de rotación (
J
K
L
yM
). Vuelva a aplicar eliminadomo
pormod
ysu
parasub
.Editar: -12 En línea la función de proyecto y dibujar y eliminar (ahora vacío) diccionario adjunto.
Editar: -36 Codificó el circuito (es decir, las caras ) en una cadena.
Editar: -8 Eliminar definición de matriz de vértices
V
. En cambio, deje en la pila ydup
copias de trabajo según sea necesario (una vez, al principio, y nuevamente al final del ciclo). Además, tradujo algunos operadores de cadenas de tokens binarios a nombres abreviados donde el BTS no dio ahorros, por(I)$
lo que ahora esfora
(es decirforall
).if du
podría ser(T8)$
, peroif du
es claramente una mejor opción (es golf , no ofuscación per se). Además, realice elscale
antestranslate
, para que las coordenadas traducidas puedan ser3
y en4
lugar de300
y400
.Los
3
4
y100
en la primera línea del segundo bloque son parámetros que representan centro-x, centro-y y escala, respectivamente, del dibujo en la página (las coordenadas centrales se escalan porscale
). (300,400) es aproximadamente el centro del papel tamaño carta estadounidense (612,792) en unidades PS.Si puede seguir aproximadamente PostScript, las cosas extrañas importantes son el bloque de procedimiento implícito y las cadenas de operador codificadas. Como se muestra en los comentarios en el archivo de trabajo, a continuación, cada línea del primer bloque está implícitamente nombrada por A, B, C, etc. Entonces, por ejemplo.
F E D
produciría1 0 0 1 0 0
. Para las cadenas de operador codificadas, cualquier cosa que sea un argumento$
#
o@
una secuencia de llamadas de operador, utilizando los bytes para seleccionar operadores de la tabla de nombres del sistema, PLRM 3ed Apéndice F. Estas características y más están disponibles para PostScript con la biblioteca G ( ahora también incluye las funciones mat.ps).Archivo de trabajo:
Ungolfed y ligeramente comentado:
Algunas de mis salidas son imágenes espejo de los ejemplos de la pregunta.
Para
gs -- hc.ps 0 0 0 0 0 0
, me sale:gs -- hc.ps 0 0 0 0 0 30
gs -- hc.ps 30 0 0 0 0 30
gs -- hc.ps 0 0 0 30 30 30
gs -- hc.ps 45 45 45 0 0 0
gs -- hc.ps 45 45 45 45 45 45
Animación adicional que acabo de hacer con este programa. Esta imagen corresponde a la secuencia de rotación 0 30 60 0 i i , donde i varía de 0 a 360 por 2.
fuente
C # + Unidad,
1060845835 bytesC # ≈ Java
Asume que esta función está en un script colocado
MainCamera
.Editar:
Gracias a @TuukkaX por las sugerencias para guardar 19 bytes. Guardado ~ 200 bytes usando el ciclo Euleriano.
Golfizado:
Newlines + sangría + Shell completo:
No pude encontrar una fórmula simple para construir las matrices de rotación ni las "caras" que dibujar, por lo que costará muchos bytes codificar.Tomé prestado el ciclo euleriano de @beaker. Además, los elementos integrados de Unity son extremadamente detallados.Puede verificar todos los casos de prueba en línea .
fuente
0.5f
se puede reducir a.5f
y0.01f
para.01f
. También creo que las matrices de enteros se pueden separar con una coma en lugar de decirint[]
varias veces.int[,]
. Aún así, gracias.Vector4(0.5f,0.5f,0.5f,0.5f)
que podría reducirse aVector4(.5f,.5f,.5f,.5f)
.Javascript ES6, 584 bytes
"Sin golf":
Véalo en acción (modificado para rotar continuamente):
La función devuelve un objeto de lienzo HTML5, debe agregarlo a la página haciendo,
document.body.appendChild(f(0,0,0,0,0,0))
por ejemplo.Actualmente, las rotaciones se aplican fuera de orden, estoy trabajando en el reordenamiento, pero como es, rota un hipercubo correctamente.
fuente
Mathematica,
453415 bytes *Se acorta usando el recorrido Euleriano y limpiándolo todo en una sola declaración sin definir funciones en variables. Esto hace que el código sea más lento por alguna razón. Supongo que Mathematica reevalúa las funciones varias veces ahora que no están almacenadas en una variable.
* Estoy contando
°
y==
como bytes individuales cada uno ya que están representados como un solo carácter en Mathematica. Creo que esto es justo, ya que muchos idiomas usan codificaciones de caracteres extraños.Ungolfed con comentarios. La entrada está codificada en la parte superior como
a={30,0,0,0,0,30};
. No conté eso para mi puntaje.0 0 0 0 0 30
0 0 0 30 30 30
405 10 -14 -8 -9 205
fuente