El rompecabezas deslizante más reconocible es el quince rompecabezas . Tiene una cuadrícula de 4 por 4, 15 mosaicos y un espacio de cuadrícula vacío. Los mosaicos solo pueden moverse hacia el espacio vacío y siempre deben estar alineados con la cuadrícula.
Definamos un rompecabezas deslizante generalizado como una cuadrícula bidimensional de ancho W por alto H ( W , H ambos enteros positivos) que contiene cierto número de mosaicos idénticos sin marcar (entre 0 y W × H de ellos) ajustados a la cuadrícula, dispuestos en de cualquier manera (sin superposición), con espacios de cuadrícula vacíos que llenan el resto del área.
Por ejemplo, si W y H son 3 y un mosaico es T
y un espacio vacío es E
uno de los muchos arreglos posibles de rompecabezas de revestimiento es
TTT
TET
EET
Para estos acertijos hay 4 movimientos posibles: empujar todo hacia arriba , empujar todo hacia abajo , empujar todo hacia la izquierda o empujar todo hacia la derecha . 'Empujar' en alguna dirección hace que todas las fichas viajen en esa dirección lo más lejos posible hasta que golpeen otra ficha o el límite de la cuadrícula. A veces empujar no cambiará el diseño de la cuadrícula,
Si la cuadrícula de ejemplo se empuja a la derecha, el resultado es
TTT
ETT
EET
Empujado a la izquierda el resultado es
TTT
TTE
TEE
Empujado hacia abajo el resultado es
EET
TET
TTT
(observe que tanto el extremo izquierdo se T
movió)
Empujar hacia arriba no cambia el diseño de la cuadrícula en este caso.
Tenga en cuenta que, dado que los mosaicos son indistinguibles, estos rompecabezas no tienen estados 'resueltos'. También tenga en cuenta que un rompecabezas puede comenzar en un diseño al que es imposible volver una vez que se ha realizado un empuje (por ejemplo, una ficha en el medio de una cuadrícula de 3 por 3).
Desafío
Usando solo ASCII imprimible, escriba dos bloques rectangulares de código, tanto M caracteres de ancho como N caracteres de alto (para cualquier número entero positivo M , N ). Un bloque de código representará un mosaico de un rompecabezas deslizante, el otro bloque de código representará un espacio de cuadrícula vacío.
Organizar estos dos bloques de código en una cuadrícula W por H creará un rompecabezas deslizante representado por código que se puede guardar como un archivo de texto y ejecutar como un programa normal. Cuando se ejecuta, este tipo de programas debe solicitar al usuario a través de stdin un número del 1 al 4; 1 es para arriba, 2 abajo, 3 a la izquierda, 4 a la derecha . Cuando el usuario escribe su número y pulsa enter, el programa calcula cómo empujar sus mosaicos de código fuente en esa dirección y guarda el nuevo diseño del rompecabezas en un archivo (ya sea un nuevo archivo o en el mismo archivo), luego termina.
Este proceso puede repetirse indefinidamente con el nuevo archivo de código de rompecabezas deslizante generado después de cada empuje.
Ejemplo
Supongamos que mi bloque de código de mosaico se ve así
// my
// tile
y mi bloque de código de espacio de cuadrícula vacío se ve así
//empty
//space
( M = 7, N = 2, por supuesto, este no es el código real)
Cualquier disposición válida de rompecabezas deslizante de estos dos bloques debería crear un programa en el lenguaje que estoy usando que se pueda ejecutar para permitir al usuario empujar en alguna dirección.
La representación del código de la cuadrícula de ejemplo es:
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
Entonces, ejecute esto y presione 2 (para bajar) y luego Enter escribiría esto en otro archivo (o el mismo archivo):
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
Ese archivo podría ejecutarse y enviarse exactamente de la misma manera.
Notas
Cualquier representación de código de un rompecabezas deslizante W by H debe ser ejecutable y poder empujarse correctamente. Esto incluye todos los tamaños de cuadrícula desde 1 por 1 hasta un máximo razonable (2 16 por 2 16 o más).
Un programa puede leer su propio código fuente. No hay restricciones basadas en quine. Los comentarios de cualquier tipo también están bien.
El programa debe solicitar una dirección para empujar incluso si no hay fichas para empujar o no se pueden empujar fichas. El mensaje es simplemente un lugar para escribir un número, no se requiere ningún mensaje.
Puede suponer que la entrada siempre es válida (1, 2, 3 o 4).
Rellenar sus bloques de código con espacios está bien. Recuerde que solo pueden ser ASCII imprimibles, esto significa que no hay pestañas ni nuevas líneas (además de las nuevas líneas que ayudan a formar los bloques de código).
Si su idioma no es compatible con stdin, use el método de entrada que parezca más cercano.
Puede requerir que haya una nueva línea al final de sus archivos de rompecabezas de códigos. (O requiera que no esté allí).
Cómo nombrar nuevos archivos no es importante.
f.txt
o simplementef
está bienLos dos bloques de código pueden no ser idénticos.
Puntuación
El objetivo es hacer esto con el tamaño de código más pequeño (razón por la cual esto se etiqueta con código de golf). El envío con el área de bloque de código más pequeña ( M × N ) es el ganador. El desempate va a la respuesta más votada.
Relacionado: Código que ejecuta el Juego de la Vida en sí mismo
f.txt
? Si.