Resumen
El objetivo de este desafío es crear una versión de imagen deshecha de un rompecabezas de 15 rompecabezas / deslizamiento también llamado taquin en francés.
Detalles:
Dada una entrada compuesta de:
- una imagen,
- un número entero
n
, - un otro número entero
r
,
su programa o función, o cualquier otra cosa que se ajuste, debe generar la misma imagen ( es decir, el mismo tamaño y formato) que la entrada, pero que se sometió al siguiente proceso:
- divide la imagen en
n²
rectángulos, - eliminar uno de esos rectángulos, al azar,
- mueva un número aleatorio de rectángulos contiguos desde la línea / columna afectada por el punto (2.) para que se llene el agujero creado y se genere otro en esta línea / columna. Este número puede ser
0
si el espacio en blanco está en una esquina o en un borde.
Repetir (3.) r
veces.
Aclaraciones:
- Si movió rectángulos desde la línea en el paso (3.), debe mover rectángulos desde la columna en la siguiente repetición,
- si movió rectángulos de izquierda a derecha en un paso de línea, se deben mover de derecha a izquierda en el siguiente paso de línea, lo mismo para columnas concernientes de arriba a abajo y de abajo a arriba,
- puede suponer que
n
se elegirá para que divida las longitudes de los lados de la imagen.
Un último punto:
Una animación que .gif
muestra todo el proceso es muy bienvenida.
Propongo usar la siguiente imagen (que es 1024x768
), con n=16
y r=100
como modelo, puede usar cualquier otra imagen (siempre que sea relevante y cumpla con las reglas de SE, por supuesto).
Tenga en cuenta que se aplican las políticas de lagunas legales.
Este es el código de golf , por lo que gana la presentación más corta.
Como se solicitó un ejemplo, aquí hay uno, hecho "a mano", con n=4
yr=1
Pasos 1 y 2
Paso 3 : en línea, 2 rectángulos a la izquierda
move a random number of contiguous rectangles
puede ser 0 rectángulos? (sería un dolor hacer que el programa cambie el comportamiento cuando el espacio en blanco está en un borde / esquina)Respuestas:
Mathematica, 246 bytes
Función anónima. Contiene U + F3C7, correspondiente al
Transpose
operador de Mathematica . Esta función toma unImage
objeto y devuelve unImage
objeto.Animación de muestra, con
n=16
yr=100
Después de 5000 iteraciones:
(haga clic en la imagen para una versión más grande)
Explicación
Inicialización
Almacene la
Nest
función (operación repetida) enn
.Almacene la
RandomInteger
función enk
, y laReverse
función enq
.Dividiendo la imagen
Particionar la imagen de entrada en (segunda entrada) ^ 2 mosaicos.
Genere dos
RandomInteger
s entre 1 y la segunda entrada. Esto selecciona un mosaico aleatorio.Haz que el azulejo sea blanco. Almacenarlo en
i
.Azulejos en movimiento
Genere dos enteros aleatorios de 0 a 1, y almacénelos en
t
yr
, respectivamente. Esto selecciona aleatoriamente la dirección.Definir función
o
: la composición det
tiempos de entrada .r
veces.Aplicar
o
a la entrada.Encuentra la columna de
i
(imagen en blanco).Resta uno y encuentra un número entero aleatorio entre 0 y ese número. Esto elige al azar cuántas fichas mover.
Cuando dicho número de mosaicos ocurra antes de una
i
(imagen blanca), cambie sus lugares.Invierta la
o
función y aplíquela al resultado de la operación anterior. Esto anula y transpone la imagen.Bucle y ensamblaje de imagen
Repita el proceso anterior (tercera entrada) veces.
Pon las imágenes juntas.
fuente