Me gusta la curva de Hilbert .
Su tarea para este desafío es tomar una imagen (estrictamente una imagen cuadrada donde todos los lados tienen una potencia de dos píxeles de ancho) y desentrañarla línea por línea en forma de zigzagueo y descifrarla en una curva pseudo-Hilbert .
Desentrañar
Para desentrañar, comenzará con el píxel en la esquina superior izquierda y viajará a la derecha hasta llegar al borde de la imagen. Una vez que haya alcanzado el borde de la imagen, se moverá hacia la siguiente fila y comenzará a viajar hacia la izquierda hasta que vuelva a tocar el borde. Continuará desentrañando fila por fila cambiando la dirección cada vez para obtener una curva continua. Esto debería verse como un juego de serpientes bien jugado
El resultado de desentrañar debería ser un orden de píxeles que incluye cada píxel exactamente una vez
Replanteando
Una vez que haya ordenado los píxeles, los reorganizará en un nuevo lienzo de igual tamaño siguiendo el camino de una curva pseudo-Hilbert. Para una 2**n
imagen cuadrada de tamaño, debe usar la enésima iteración de la curva pseudo-hilbert. Cada píxel se colocará exactamente en un punto en el nuevo lienzo. Debe volver a dibujar la imagen para que el punto originalmente en la parte superior izquierda (el comienzo de nuestra curva de serpiente) permanezca allí y el punto en la parte inferior derecha (el final de nuestra curva de serpiente) se coloque en la parte superior derecha.
I / O
Su programa o función debe tomar una imagen de restricciones especificadas a través de métodos estándar y generar otra imagen a través de métodos estándar.
Tanteo
Este es un programa de código de golf con la menor cantidad de bytes ganados.
Ejemplos
Entrada
Salida
Entrada
Salida
Entrada
Salida
También recomiendo probar en una imagen en blanco o en color sólido para asegurarse de que no le faltan píxeles.
¡No dude en incluir sus propios resultados en sus respuestas!
fuente
Respuestas:
Mathematica,
286273 bytes¡Uf! ¡Desafiante pero divertido!
Explicación
Convierta una
Image
en una matriz de valores RGB.Genere una matriz
l
byl
con head1
, dondel
es la longitud de la entrada (es decir, el ancho de la imagen).Esto produce
{{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}
(l
escrito en mayúsculas para reducir la confusión)Una
StringReplace
función que reemplaza cada"L"
con"+RF-LFL-FR+"
y"R"
con"-LF+RFR+FL-"
Aplicar la
StringReplace
función de losString
"L"
,Log2[l]
tiempos.Convierta el resultado
String
en unaList
de caracteres.Una función sin nombre que:
"-"
, multiplique el segundo elemento de la primera entrada porI
."+"
, divida el segundo elemento de la primera entrada porI
."F"
, aumente la primera entrada porReIm
(separa la parte real e imaginaria de la entrada) de la segunda entrada.Comenzando con
{{1,1},I}
, aplique de forma acumulativa la función sin nombre anterior, utilizando cada elemento de losList
caracteres como segunda entrada. Este código produce los resultados de todas las iteraciones.Deshágase de los segundos elementos de cada uno
List
y elimine los duplicados. (Los pasos hasta este punto generan unaList
de las coordenadas de la curva de Hilbert)Desentrañar la matriz RGB de entrada (invierte cada dos filas y se aplana).
Cree
Rule
objetos, de modo que el primer elemento en la primera entrada (las coordenadas de la curva de Hilbert) se empareje con el primer elemento de la segunda entrada (la imagen desenredada), el segundo elemento con la segunda entrada, y así sucesivamente.Aplique esos reemplazos
Rule
alArray
del segundo paso.Convierte a la matriz de valores RGB en un
Image
.Muestra de entrada / salida
Entrada:
Salida:
Entrada:
Salida:
Función inversa (
266253bytes)fuente
Octava 234 Bytes
Los nombres de archivo de las imágenes de entrada y salida deben proporcionarse a partir de la entrada estándar. El tamaño del código sin entrada / salida es de 194 bytes .
Explicación:
El patrón base de los índices es:
En cada iteración, 4 copias del resultado de la iteración anterior realizada y alguna transformación aplicada a cada copia, luego todos los bloques se concatenan para formar el resultado actual.
entonces tenemos:
Índices de Hilbert ordenados e índices de elementos ordenados devueltos:
Desentrañar aplicado volteando todas las filas pares:
Replanteo aplicado:
-S repetido para cada canal
-permutación aplicada ya que en los datos de octava dispuestos en columnas
Imágenes de ejemplo:
fuente