Inspirado por esta pregunta
Otra forma de desenrollar una imagen 2D en una cadena 1D es usar una curva de Hilbert.
Hay muchas versiones de esta curva, dependiendo del número de iteraciones utilizadas al calcularla. A continuación, siga el ejemplo de las curvas de Hilbert de primer orden a quinto orden.
La forma de calcular esta curva es la siguiente. Primero definimos la curva de Hilbert de primer orden como la que se muestra en la figura (la de n = 1), para que quepa en un cuadrado de 1x1. Entonces hacemos cuatro copias de esta curva, espaciándolas en un cuadrado de 4x4, de modo que todas presenten la "concavidad" hacia el lado izquierdo. Luego volteamos las dos curvas de orden 1 más a la izquierda, de modo que la concavidad superior se enfrenta hacia la parte superior, mientras que la inferior se enfrenta a la parte inferior. Finalmente conectamos las esquinas de las curvas adyacentes de Hilbert. Si queremos obtener una curva de orden (n + 1), solo necesitamos repetir el proceso con cuatro curvas de orden n. Podemos ver una visualización del proceso aquí (también agregaré una imagen que detalla el proceso pronto)
Su tarea en este desafío es desenrollar una matriz de enteros a lo largo de la curva de Hilbert de orden más bajo para esa matriz.
En aras de la simplicidad, tendremos la curva comenzando desde la esquina superior izquierda de la matriz.
Puede recibir la entrada como una lista de enteros, donde cada sublista representa una fila de la matriz.
Puede suponer que la entrada será una matriz cuadrada (n * n).
Por ejemplo:
Entrada:
[[ 1, 2,]
[ 3, 4 ]]
Salida:
[ 1, 2, 4, 3 ]
Como estamos usando la curva de Hilbert de primer orden que se muestra en la figura
Entrada:
[[ 1, 2, 3, 4, ]
[ 5, 6, 7, 8, ]
[ 9, 10, 11, 12, ]
[ 13, 14, 15, 16 ]]
Salida:
[ 1, 5, 6, 2, 3, 4, 8, 7, 11, 12, 16, 15, 14, 10, 9, 13 ]
Usando la curva de Hilbert de segundo orden
Como de costumbre, las lagunas estándar no están permitidas.
Este es el código de golf, por lo que gana la respuesta más corta en bytes.
fuente
Respuestas:
MATL ,
8685 bytesEsta solución se basa en la entrada de Intercambio de archivos de Jonas Lundgren que utiliza números complejos para generar la curva de Hilbert. Estos números complejos se convierten luego en valores de índice para recuperar los elementos de la matriz que se encuentran a lo largo de la curva.
Pruébalo en línea!
Explicación
fuente
APL (Dyalog Unicode) , SBCS de 41 bytes
Ahorró 30 bytes (!) Al consultar la sabiduría de APL Orchard, especialmente @ngn y @ Sherlock9.
Pruébalo en línea!
Explicación como sigue:
Más detalles sobre " escaneo de transposición monádica ".
Documentación de Dyalog sobre protectores de errores .
fuente
Mathcad, 302 bytes
El siguiente programa Mathcad se basa en el programa Python @ Sherlock9. Se diferencia al curvar matrices rectangulares al ignorar aquellas partes de la curva de Hilbert que se encuentran fuera de los límites de la matriz. Tenga en cuenta que como Mathcad tiene un manejo de cadenas relativamente pobre, he asignado los símbolos de Lindenmayer a enteros en la función de Hilbert.
Mathcad funciona a través de una interfaz 2D que permite al usuario colocar (y mezclar libremente) expresiones matemáticas, diagramas, texto, entradas y salidas. He igualado un byte a la operación mínima equivalente del teclado del usuario para crear un símbolo (por ejemplo, el operador de definición (: =) se ingresa simplemente escribiendo:.
fuente
Pitón 3,
327289275271239234 bytesEsta es una solución que modifiqué de mi respuesta para otra pregunta de la curva de Hilbert aquí . Cualquier consejo de golf es apreciado.
Editar: se modificó cómo
g
se incrementa y disminuye. Ahora usandoeval()
ystr.translate
. Ya no lo usol=len(s)
.Sin golf:
fuente
Wolfram - 233
Basado en la representación como sistema Lindenmayer :
fuente
Rubí,
224221216 bytesEsta respuesta se basa en mi respuesta de Python .
No golfista:
fuente
CJam, 60
Pruébalo en línea
Explicación:
Estoy construyendo el fractal como una serie de direcciones de movimiento: 0 = derecha, 1 = abajo, 2 = izquierda, 3 = arriba.
fuente