Escreva um programa para produzir um arquivo contendo uma grade de palavras cruzadas na qual o usuário possa imprimir e trabalhar o quebra-cabeça.
Entrada
Um nome de arquivo representando um arquivo de grade de palavras cruzadas e, opcionalmente, um segundo nome de arquivo representando um arquivo de numeração de palavras cruzadas. A entrada deve ser aceita por um meio convencional para o seu ambiente de programação: argumentos de linha de comando, entrada padrão, formulários da web etc.
Você pode assumir que as palavras cruzadas foram validadas e se estiver usando um arquivo de numeração que corresponda à grade fornecida .
Formato de arquivo de grade: A primeira linha consiste em duas constantes inteiras separadas por espaços em branco M e N. A seguir, há linhas M, cada uma composta por N caracteres (mais uma nova linha) selecionados [#A-Z ]
. Esses caracteres são interpretados de forma a '#'
indicar um quadrado bloqueado, ' '
um quadrado aberto no quebra-cabeça sem conteúdo conhecido e qualquer letra um quadrado aberto que contenha essa letra.
Formato do arquivo de numeração As linhas que começam com '#' são ignoradas e podem ser usadas para comentários. Todas as outras linhas contêm uma guia separada tripleto i
, m
, n
onde i
representa um número a ser impresso sobre a grade, e m
e n
representam a linha e a coluna do quadrado onde deve ser impresso. O número de linhas e colunas começa em 1.
Resultado
A saída será um arquivo no qual o usuário poderá imprimir e trabalhar com palavras cruzadas. Serão aceitos ASCII, postscript, pdf, png e qualquer outro formato razoável, mas todos devem respeitar estas regras:
- Deve haver uma regra em torno de todo o quebra-cabeça e entre cada par de quadrados.
- Quadrados bloqueados devem ser preenchidos sombriamente.
- No quadrado de jogo que representa o início de uma pista numerada (do outro lado ou para baixo) deve ser fornecido com um número no canto superior esquerdo do quadrado, deixando a maior parte do quadrado em branco para a peça escrever. Observe que a grade típica publicado nos jornais terá muitas dezenas de pistas e poderá ter mais de 100.
A saída será apenas da grade, sem a lista de pistas.
A saída deve ser enviada para um destino convencional (um arquivo cujo nome é derivado do nome do arquivo de entrada, produzido como uma página da web, etc.)
Caso de teste
Dada uma contribuição de
5 5
# ##
#
#
#
## #
o canto inicial de uma saída ASCII aceitável pode se parecer com isso
+-----+-----+-----+---
|#####|1 |2 |###
|#####| | |###
|#####| | |###
+-----+-----+-----+---
|#####|3 | |4
|#####| | |
|#####| | |
+-----+-----+-----+---
|6 | |#####|
| | |#####|
Quem usa formatos gráficos deve se inspirar nas fontes impressas usuais.
Esquema de numeração
Uma grade numerada corretamente possui as seguintes propriedades:
- A numeração começa em 1.
- Nenhuma coluna ou extensão de quadrados abertos é numerada.
- Os números serão encontrados em ordem de contagem, digitalizando da linha superior para a inferior, levando cada linha da esquerda para a direita.
a parte, de lado
Este é o terceiro de vários desafios relacionados às palavras cruzadas. Pretendo usar um conjunto consistente de formatos de arquivo e criar um conjunto respeitável de utilitários relacionados a palavras cruzadas no processo.
Desafios anteriores desta série:
fonte
Respostas:
Python, 379 caracteres
fonte
next(f)
vez def.readline()
. Você não precisa.readlines()
disso.Postscript
905 797 677 675 629 608 330 320308Este programa é escrito como um "protocolo de protocolo", para que você possa agrupá-lo juntamente com os arquivos de grade e número (nessa ordem, separados por linhas em branco) e canalizar toda a bagunça para o ghostscript, Distiller ou uma impressora PS. Anexado à versão de referência abaixo está um quebra-cabeça do NYT (de 5 de novembro de 2011) com números e uma resposta que eu tenho certeza (os sábados são difíceis!).
A nova revisão usa esses dois procedimentos para executar nomes de sistemas codificados em binários a partir de strings.
Recuado e (um pouco) comentado.
Arquivos de dados.
A impressora deve parecer boa, mas na tela ela precisa de uma pequena ajuda. Esse procedimento de 19 caracteres e 9 caracteres para invocá-lo em todos os pontos de espaço do usuário ajuda a tornar as linhas com espaçamento uniforme mais uniformes. Então 308 + 19 + 9 = 337, usado para gerar esta imagem.
Postscript 608
Esta versão anterior (da revisão 8 ) usa uma abordagem completamente diferente, reutilizando o código da linha principal como um "léxico" do qual tokens mais longos podem ser indexados usando seqüências de caracteres.
Foi escrito usando esta versão comentada que ilustra a codificação do léxico. O primeiro token
30
é comentado,space
portanto,( )*
é sinônimo de30
. Não é muito benéfico para30
, mas para tokens mais longos essa é (foi) uma grande vitória (até que possibilidades mais profundas de codificação sejam (foram) descobertas).fonte
C (saída para SVG), 553 caracteres
Eu sei, o código é enorme, mas esse problema está implorando por uma resposta SVG.
Quando executado, obtém os dois nomes de arquivos em duas linhas separadas de entrada padrão; primeiro o arquivo de grade, depois o arquivo de números.
A lógica desta é realmente bastante simples. O formato do SVG permite criar todos os elementos em qualquer ordem (em vez de ir de cima para baixo, como na solução de saída ASCII). O tamanho é devido quase inteiramente ao clichê SVG.
Mas a imagem resultante está ótima!
Editado para adicionar: aqui está uma versão mais curta (517 caracteres) que gera uma resolução específica. Isso permite que o código use mais configurações padrão, mas ao custo proibitivo (a meu ver) que o SVG não redimensiona mais automaticamente no seu navegador da web.
fonte
Haskell, 328 caracteres
fonte
C, 375 caracteres
Os dois nomes de arquivos de entrada são inseridos na entrada padrão, cada um em uma linha separada. A grade é renderizada em ASCII na saída padrão. Sim, é uma interface de usuário ruim, mas qualquer coisa melhor custa caracteres. Comecei a invocá-lo assim:
O programa deve lidar corretamente com coisas como linhas comentadas no arquivo de numeração.
fonte
*r++-=b[i++]==35
(g
é inicializado com zeros).for(j=3*(f<r);j--;puts("|"))
salvaif
.n&&j>1
->j/2*n
Scala 463, formato de saída: html
Saída de amostra
fonte
PostScript
(435)(434)Sem jogar golfe com dados:
fonte
stopped
. ... Vou deixar a recompensa em aberto por um dia ou mais para atrair atenção.Postscript, não combatente.
Inspirado (mais uma vez) por sua pergunta relacionada ao SO , criei uma versão de referência no Postscript usando o arquivo IO. Ele também cria uma fonte derivada de largura fixa para que os dados da grade sejam simplesmente transmitidos
show
.é uma caixa vazia e
#
é uma caixa cheia. Qualquer outro caractere ascii é desenhado como um pequeno glifo Times-Romano cercado por uma caixa.Este programa utiliza um recurso ghostscript que pode não estar presente em todos os intérpretes Postscript. Se o ghostscript for chamado com a
--
opção, ele passará argumentos da linha de comando para o programa postscript em uma matriz de cadeias denominada / ARGUMENTS. Então, você precisa invocar o programa assimgs -- xw-io.ps grid-file number-file
.fonte