Codifique un código Slidey Puzzle!

12

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 Ty un espacio vacío es Euno 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 Tmovió)

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.txto simplemente festá bien

  • Los 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

Pasatiempos de Calvin
fuente
Entonces, ¿el programa debe funcionar cuando solo hay espacios vacíos y sin bloques de mosaico (y viceversa)?
grc
@grc Sí a su primera pregunta, y recuerde que aún debe solicitar un valor de inserción incluso si está totalmente vacío o lleno. No, los bloques no pueden ser idénticos. Supongo que si lo fueran, podrías decir que tienes una respuesta bastante trivial. Así que lo mencionaré.
Aficiones de Calvin
¿Puedo especificar el nombre del archivo fuente original?
feersum
@feersum Like, ¿puedes asumir que siempre es así f.txt? Si.
Aficiones de Calvin
¿Los bloques de código no serán siempre 1 línea? Los bloques de código de varias líneas me parecen realmente complejos y los idiomas 2D probablemente no tienen soporte para escribir archivos.
Def

Respuestas:

5

TECO , 153

Bloque vacío:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Bloque de azulejos:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

El programa, que se modifica en su lugar, debe guardarse en un archivo llamado x. Se puede ejecutar a través del comando tecoc mung x.. El punto es importante; sin él, TECO intentó encontrar un archivo llamado x.tec. La nueva línea final debe estar presente.

La restricción ASCII imprimible fue un poco difícil para este, ya que el lenguaje utiliza muchos caracteres no imprimibles. La mayoría de ellos pueden ser reemplazados por una secuencia de dos bytes que comienza con un símbolo de intercalación, pero "Escape" (ASCII 27) es el único carácter que es 'ineludible', por lo que para obtenerlo tuve que poner su valor ASCII en una cadena y Ejecútelo. Por lo tanto, el 4-byte EBx<Esc>explotó en @^Ux#EBx#27@:^UX##Mx.

Esto podría reducirse en gran medida, especialmente dividiendo el programa en dos partes, almacenándolas como cadenas y ejecutándolas solo si ambas están presentes.

Feersum
fuente