Validar una cuadrícula de crucigramas propuesta.
Las entradas deben ser programas completos que simplemente prueben una cuadrícula propuesta para determinar si cumple con un conjunto de condiciones para hacer felices a los solucionadores de crucigramas.
Entrada
La entrada será el nombre de un archivo que representa la cuadrícula de crucigramas. El nombre de archivo de entrada se puede pasar como argumento, en la entrada estándar o por otros medios convencionales que no sean la codificación fija.
Formato de archivo de cuadrícula: la primera línea consta de dos constantes enteras separadas por espacios en blanco M y N. A continuación de esa línea hay M líneas que consisten en N caracteres (más una nueva línea) seleccionados entre [#A-Z ]
. Estos caracteres se interpretan de tal manera que '#'
indican un cuadrado bloqueado, ' '
un cuadrado abierto en el rompecabezas sin contenido conocido y cualquier letra un cuadrado abierto que contenga esa letra.
Salida
El programa no debe producir ninguna salida en cuadrículas válidas y salir con un estado de terminación normal. Si la cuadrícula propuesta falla, el programa debería generar un mensaje de error de diagnóstico y salir con un estado de terminación anormal (es decir, no 0 en Unix) si su entorno de ejecución lo admite. El mensaje de error debe indicar qué condición de validez se viola y la ubicación del cuadrado infractor; Usted es libre de elegir los medios para transmitir estos hechos.
Condiciones de validez
Las cuadrículas válidas no tendrán respuestas (cruzadas o hacia abajo) que tengan solo 1 carácter (crédito adicional por hacer que la longitud mínima sea un parámetro de entrada) y exhibirán la simetría habitual. La simetría habitual significa que el crucigrama permanece igual después (tres descripciones equivalentes de la misma operación):
- reflexión a través de su propio centro
- reflejo tanto vertical como horizontalmente
- Rotación de 180 grados
Prueba de entrada y salida esperada
Pases
5 5
# ##
#
#
#
## #
Falla en la respuesta corta:
5 5
## ##
#
#
#
## ##
Falla en la simetría:
5 5
# ##
#
#
# #
## #
Aparte
Este es el segundo de varios desafíos relacionados con crucigramas. Planeo usar un conjunto consistente de formatos de archivo en todo momento y construir un conjunto respetable de utilidades relacionadas con crucigramas en el proceso. Por ejemplo, un rompecabezas posterior requerirá imprimir una versión ASCII del crucigrama basado en la entrada y salida de este rompecabezas.
Retos anteriores en esta serie:
Respuestas:
Rubí -
215207Sin golf:
.
Básicamente, esto elimina el último carácter (salto de línea) de cada línea de entrada llamando al
chop
método en ellos y devolviendo una matriz de los resultados.h
toma el primer elemento de esta matriz y*g
toma el resto. Así terminamos con la primera líneah
y las líneas de la cuadrícula de crucigramasg
.g*?#
une (*
) la matrizg
con"#"
(?#
es un carácter literal). Esto es lo mismo queg.*("#")
, og.join("#")
. Entonces cada no#
es reemplazado por un espacio.Para la verificación de simetría solo tenemos que verificar si el carácter en cada índice es igual al carácter en el índice opuesto en la cadena:
En Ruby podemos indexar cadenas desde el final usando índices negativos (comenzando desde en
-1
lugar de0
), por lo queg[-i-1]
es lo contrario deg[i]
en la cadena. Esto ahorra algunos caracteres:Podemos guardar un
;
usando una declaración condicional:En la versión de golf podemos guardar algunos caracteres más:
En una versión anterior, utilicé la recursión para iterar sobre la cadena:
Un acceso fuera de límite a
g
retornos nulo, por lo que una vez queg[i]
regresanil
, esto detiene la iteración.Formato de salida:
L para errores de longitud y R para error de rotación (
L 1 2
significa error de longitud en la línea 1, columna 2)fuente
Implementación de referencia
c99
fuente
C, 278 caracteres
Como es de esperar, los mensajes de error se han mejorado. Toman la siguiente forma:
11L8
- indica un error de longitud en la fila 11 columna 84S10
- indica un error de simetría en la fila 4 columna 10fuente
APL (115)
Si la cuadrícula no es simétrica, sale
Si la cuadrícula tiene respuestas cortas, sale⍉
seguida de las coordenadas, es decir, para el ejemplo que da∘
seguida de las coordenadas, es decir, para el ejemplo que daExplicación:
d↑↑{'#'≠⍞}¨⍳⊃d←⎕
: lea la primera línea como una lista de números y almacened
, luego lea tantas líneas como el primer número y vuelva a formar como una matriz de tamañod
. Los cuadrados 'cerrados' se almacenan como 0 y los cuadrados 'abiertos' como 1.∨/,k←⍵≠⌽⊖⍵
: almacenar enk
los lugares donde la cuadrícula es asimétrica. Si hay tal lugar ...'⍉',(,k×⍳⍴k)~⊂2/0
: muestra un ⍉ seguido de las coordenadas ofensivas⋄
: de lo contrario ...~⊂2/0
: elimina las coordenadas cero de la siguiente lista:¨⍵(⍉⍵)
: tanto para la cuadrícula como para su transposición ...¯1⌽¯1⊖⍵↑⍨2+k←⍴⍵
: rodea la cuadrícula con ceros (es decir, cuadrados cerrados)0 1 0⍷
: vea dónde contiene un cuadrado 'abierto' encerrado por dos cuadrados 'cerrados' (= demasiado corto)k↑1⌽1⊖
: quite de nuevo el anillo de ceros adicionales,⊃,/(g(⍉g←⍳⍴⍵))×
: multiplique por coordenadas y coordenadas transpuestas, y únalas para formar una lista de coordenadas ofensivas (y muchos ceros que eliminamos).×⍴d←
: almacena las coordenadas ofensivasd
, y si hay alguna ...:'∘',d
: genera un ∘ seguido de las coordenadas.fuente