Escriba un programa para producir un archivo que contenga una cuadrícula de crucigramas que el usuario pueda imprimir y resolver el rompecabezas.
Entrada
Un nombre de archivo que representa un archivo de cuadrícula de crucigramas y, opcionalmente, un segundo nombre de archivo que representa un archivo de numeración de crucigramas. La entrada debe ser aceptada por un medio convencional para su entorno de programación: argumentos de línea de comando, entrada estándar, formularios web, etc.
Puede suponer que el crucigrama ha sido validado , y si utiliza un archivo de numeración que corresponde a la cuadrícula proporcionada .
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.
Formato del archivo de numeración Las líneas que comienzan con '#' se ignoran y pueden usarse para comentarios. Todas las demás líneas contienen una pestaña separada triplete i
, m
, n
donde i
representa un número que va a imprimirse en la parrilla, y m
y n
representan la fila y columna de la plaza donde debe ser impreso. El número de filas y columnas comienza en 1.
Salida
El resultado será un archivo que el usuario puede imprimir y trabajar con un crucigrama. Se aceptarán ASCII, postscript, pdf, png y cualquier otro formato razonable, pero todos deben cumplir con estas reglas:
- Debe haber una regla alrededor del rompecabezas completo y entre cada par de cuadrados.
- Los cuadrados bloqueados deben rellenarse a oscuras
- En el cuadro de juego que representa el comienzo de una pista numerada (cruzada o hacia abajo) se debe proporcionar un número en la esquina superior izquierda del cuadrado, dejando la mayor parte del cuadrado en blanco para que la obra escriba. Tenga en cuenta que la cuadrícula típica publicado en los documentos tendrá muchas decenas de pistas y puede tener más de 100.
La salida será solo de la cuadrícula, sin la lista de pistas.
La salida debe enviarse a un destino convencional (un archivo cuyo nombre se deriva del nombre de archivo de entrada, producido como una página web, etc.)
Caso de prueba
Dada una entrada de
5 5
# ##
#
#
#
## #
la esquina inicial de una salida ASCII aceptable podría verse así
+-----+-----+-----+---
|#####|1 |2 |###
|#####| | |###
|#####| | |###
+-----+-----+-----+---
|#####|3 | |4
|#####| | |
|#####| | |
+-----+-----+-----+---
|6 | |#####|
| | |#####|
Aquellos que utilizan formatos gráficos deben inspirarse en las fuentes impresas habituales.
Esquema de numeración
Una cuadrícula numerada correctamente tiene las siguientes propiedades:
- La numeración comienza en 1.
- Ninguna columna o tramo de cuadrados abiertos está sin numerar.
- Los números se encontrarán en orden de conteo escaneando de la fila superior a la inferior tomando cada fila de izquierda a derecha.
Aparte
Este es el tercero 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.
Retos anteriores en esta serie:
fuente
Respuestas:
Python, 379 caracteres
fuente
next(f)
lugar def.readline()
. No necesitas el.readlines()
allí en absoluto.Posdata
905 797 677 675 629 608 330 320308Este programa está escrito como un "prólogo de protocolo", por lo que solo debe juntarlo con la cuadrícula y los archivos de números (en ese orden, separados por líneas en blanco) y canalizar todo el desastre a ghostscript o Distiller o una impresora PS. Se adjunta a la versión de referencia a continuación un rompecabezas de NYT (del 5 de noviembre de 2011) con números y una respuesta de la que estoy bastante seguro (¡los sábados son difíciles!).
La nueva revisión utiliza estos dos procedimientos para ejecutar nombres de sistema codificados en binario a partir de cadenas.
Sangrado y (algo) comentado.
Archivos de información.
Debería verse bien desde una impresora, pero en la pantalla necesita un poco de ayuda. Este procedimiento de 19 caracteres y 9 caracteres para invocarlo en todos los puntos de espacio de usuario ayuda a que las líneas espaciadas de manera uniforme se vean más uniformes. Entonces 308 + 19 + 9 = 337, usado para generar esta imagen.
Postdata 608
Esta versión anterior (de la revisión 8 ) usa un enfoque completamente diferente, reutilizando el código de la línea principal como un "léxico" a partir del cual se pueden indexar tokens más largos usando cadenas.
Fue escrito usando esta versión comentada que ilustra la codificación del léxico. El primer token
30
se comenta,space
por( )*
lo tanto, es sinónimo de30
. No es muy beneficioso para30
, pero para tokens más largos esto es (fue) una gran victoria (hasta que se descubran posibilidades de codificación más profundas).fuente
C (salida a SVG), 553 caracteres
Lo sé, el código es enorme, pero este problema solo está pidiendo una respuesta SVG.
Cuando se ejecuta, obtiene los dos nombres de archivo en dos líneas separadas de entrada estándar; primero el archivo de cuadrícula, luego el archivo de números.
La lógica en este caso es bastante simple. El formato de SVG le permite crear todos los elementos en cualquier orden (en lugar de ir de arriba a abajo como con la solución de salida ASCII). El tamaño se debe casi por completo a la plantilla de SVG.
¡Pero la imagen resultante se ve genial!
Editado para agregar: Aquí hay una versión más corta (517 caracteres) que genera una resolución específica. Esto permite que el código use más configuraciones predeterminadas, pero con el costo prohibitivo (en mi opinión) de que el SVG ya no se redimensiona automáticamente en su navegador web.
fuente
Haskell, 328 caracteres
fuente
C, 375 caracteres
Los dos nombres de archivo de entrada se ingresan en la entrada estándar, cada uno en una línea separada. La cuadrícula se representa en ASCII en la salida estándar. Sí, es una pésima interfaz de usuario, pero cualquier cosa mejor cuesta personajes. Me puse a invocarlo así:
El programa debe manejar correctamente cosas como líneas comentadas en el archivo de numeración.
fuente
*r++-=b[i++]==35
(g
se inicializa a ceros).for(j=3*(f<r);j--;puts("|"))
salvaif
.n&&j>1
->j/2*n
Scala 463, formato de salida: html
Salida de muestra
fuente
Posdata
(435)(434)Sin golf con datos:
fuente
stopped
. ... Dejaré la recompensa abierta por un día más o menos para llamar la atención.Postdata, no combatiente.
Inspirado (una vez más) por su pregunta relacionada con SO , hice una versión de referencia en Postscript usando file-IO. También crea una fuente derivada de ancho fijo para que los datos de la cuadrícula simplemente se pasen
show
.es una caja vacía y
#
es una caja llena. Cualquier otro carácter ascii se dibuja como un pequeño glifo de la época romana rodeado de una caja.Este programa utiliza una función ghostscript que puede no estar presente en todos los intérpretes PostScript. Si se invoca ghostscript con la
--
opción, pasa los argumentos de la línea de comandos al programa postscript en una matriz de cadenas llamada / ARGUMENTOS. Entonces necesita invocar el programa de esta manerags -- xw-io.ps grid-file number-file
.fuente