Haz una imagen en un rompecabezas deslizante

14

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:

  1. divide la imagen en rectángulos,
  2. eliminar uno de esos rectángulos, al azar,
  3. 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 0si el espacio en blanco está en una esquina o en un borde.

Repetir (3.) rveces.

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 nse elegirá para que divida las longitudes de los lados de la imagen.

Un último punto:

Una animación que .gifmuestra todo el proceso es muy bienvenida.

Propongo usar la siguiente imagen (que es 1024x768), con n=16y r=100como 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 , por lo que gana la presentación más corta.

¡Los amantes de los perros, gatos y patos deben estar satisfechos!

Como se solicitó un ejemplo, aquí hay uno, hecho "a mano", con n=4yr=1

Pasos 1 y 2

ingrese la descripción de la imagen aquí

Paso 3 : en línea, 2 rectángulos a la izquierda

ingrese la descripción de la imagen aquí

Frédéric
fuente
El ejemplo sugiere que los rectángulos no necesitan ser del mismo tamaño, no necesitan cubrir toda la imagen y deben incluir líneas dibujadas sobre la imagen original. ¿Podría aclarar esto, ya sea cambiando la especificación o el ejemplo?
trichoplax
@trichoplax: el ejemplo fue dibujado a mano con pintura y rapidez. Lo rehaceré correctamente.
Frédéric
@trichoplax: Debo admitir que no entiendo completamente tu punto, pero esta línea de apertura no es necesaria para entender el desafío, así que supongo que es inútil mantenerlo.
Frédéric
move a random number of contiguous rectanglespuede 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)
JungHwan Min
@JungHwanMin: sí, puede. Buen comentario, gracias!
Frédéric

Respuestas:

10

Mathematica, 246 bytes

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

Función anónima. Contiene U + F3C7, correspondiente al Transposeoperador de Mathematica . Esta función toma un Imageobjeto y devuelve un Imageobjeto.

Animación de muestra, con n=16yr=100

Después de 5000 iteraciones:

ingrese la descripción de la imagen aquí(haga clic en la imagen para una versión más grande)

Explicación

Inicialización

n=Nest

Almacene la Nestfunción (operación repetida) en n.

k=RandomInteger;q=Reverse;

Almacene la RandomIntegerfunción en k, y la Reversefunción en q.

Dividiendo la imagen

#~ImagePartition~Scaled[1/#2]

Particionar la imagen de entrada en (segunda entrada) ^ 2 mosaicos.

{1,#2}~k~2

Genere dos RandomIntegers entre 1 y la segunda entrada. Esto selecciona un mosaico aleatorio.

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

Haz que el azulejo sea blanco. Almacenarlo en i.

Azulejos en movimiento

{t,r}=1~k~2

Genere dos enteros aleatorios de 0 a 1, y almacénelos en ty r, respectivamente. Esto selecciona aleatoriamente la dirección.

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

Definir función o: la composición de

  1. una función que transpone los ttiempos de entrada .
  2. una función que invierte cada fila rveces.
o @ #

Aplicar oa la entrada.

Position[o@#,i][[1,2]]

Encuentra la columna de i(imagen en blanco).

k[ ... -1]

Resta uno y encuentra un número entero aleatorio entre 0 y ese número. Esto elige al azar cuántas fichas mover.

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

Cuando dicho número de mosaicos ocurra antes de una i(imagen blanca), cambie sus lugares.

(... q[o= ... ])[ ... ]

Invierta la ofunción y aplíquela al resultado de la operación anterior. Esto anula y transpone la imagen.

Bucle y ensamblaje de imagen

(n=Nest)[ ... ,#3]

Repita el proceso anterior (tercera entrada) veces.

ImageAssemble@

Pon las imágenes juntas.

JungHwan Min
fuente
1
Buena respuesta ! Gracias por los detalles!
Frédéric