Valide uma grade de palavras cruzadas proposta.
As inscrições devem ser programas completos que simplesmente testam uma grade proposta para determinar se ela atende a um conjunto de condições para tornar felizes os solucionadores de palavras cruzadas.
Entrada
A entrada será o nome de um arquivo que representa a grade de palavras cruzadas. O nome do arquivo de entrada pode ser passado como argumento, na entrada padrão ou por outros meios convencionais que não sejam codificados.
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.
Resultado
O programa não deve produzir saída em grades válidas e sair com o estado de terminação normal. Se a grade proposta falhar, o programa deverá produzir uma mensagem de erro de diagnóstico e sair com um estado de finalização anormal (ou seja, não 0 no unix) se isso for suportado pelo seu ambiente de execução. A mensagem de erro deve indicar qual condição de validade é violada e a localização do quadrado incorreto; você é livre para escolher os meios de transmitir esses fatos.
Condições de validade
As grades válidas não terão respostas (cruzadas ou inativas) com apenas 1 caractere (crédito extra por tornar o tamanho mínimo um parâmetro de entrada) e exibirão a simetria usual. A simetria usual significa que as palavras cruzadas permanecem as mesmas depois (três descrições equivalentes da mesma operação):
- reflexão através do seu próprio centro
- reflexão vertical e horizontalmente
- Rotação de 180 graus
Entrada de teste e saída esperada
Passes:
5 5
# ##
#
#
#
## #
Falha na resposta curta:
5 5
## ##
#
#
#
## ##
Falha na simetria:
5 5
# ##
#
#
# #
## #
a parte, de lado
Este é o segundo 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. Por exemplo, um quebra-cabeça subsequente exigirá a impressão de uma versão ASCII das palavras cruzadas com base na entrada e saída desse quebra-cabeça.
Desafios anteriores desta série:
Respostas:
Ruby -
215207Ungolfed:
.
Isso basicamente remove o último caractere (quebra de linha) de cada linha de entrada chamando o
chop
método neles e retornando uma matriz dos resultados.h
pega o primeiro elemento dessa matriz e*g
pega o resto. Então, terminamos com a primeira linhah
e as linhas de grade de palavras cruzadasg
.g*?#
junta-se (*
) à matrizg
com"#"
(?#
é um caractere literal). É o mesmo queg.*("#")
, oug.join("#")
. Então todo não#
é substituído por um espaço.Para a verificação de simetria, basta verificar se o caractere em cada índice é igual ao caractere no índice oposto na string:
No Ruby, podemos indexar strings a partir do final usando índices negativos (começando em
-1
vez de0
), de modo queg[-i-1]
é o oposto deg[i]
na string. Isso economiza alguns caracteres:Podemos salvar um
;
usando uma declaração condicional:Na versão golfed, podemos salvar mais alguns caracteres:
Em uma versão anterior, usei recursão para iterar sobre a string:
Um acesso fora do limite para
g
retornos nulos; portanto, uma vezg[i]
retornadonil
, isso interrompe a iteração.Formato de saída:
L para erros de comprimento e R para erro de rotação (
L 1 2
significa erro de comprimento na linha 1, coluna 2)fonte
Implementação de referência
c99
fonte
C, 278 caracteres
Como seria de esperar, as próprias mensagens de erro foram jogadas no golfe. Eles assumem a seguinte forma:
11L8
- indica um erro de comprimento na linha 11, coluna 84S10
- indica um erro de simetria na linha 4, coluna 10fonte
APL (115)
Se a grade não for simétrica, ela sai
Se a grade tiver respostas curtas, ela sai⍉
seguida pelas coordenadas, ou seja, por exemplo, fornece∘
seguida pelas coordenadas, ou seja, por exemplo, forneceExplicação:
d↑↑{'#'≠⍞}¨⍳⊃d←⎕
: leia a primeira linha como uma lista de números e armazene-ad
, depois leia quantas linhas como o primeiro número e reformule como uma matriz de tamanhod
. Os quadrados 'fechados' são armazenados como 0 e os quadrados 'abertos' como 1.∨/,k←⍵≠⌽⊖⍵
: armazene nosk
locais onde a grade é assimétrica. Se existe um lugar assim ...'⍉',(,k×⍳⍴k)~⊂2/0
: produza a ⍉ seguido pelas coordenadas incorretas⋄
: de outra forma...~⊂2/0
: remova as coordenadas zero da seguinte lista:¨⍵(⍉⍵)
: para a grade e sua transposição ...¯1⌽¯1⊖⍵↑⍨2+k←⍴⍵
: rode a grade com zeros (quadrados fechados)0 1 0⍷
: veja onde ele contém um quadrado 'aberto' delimitado por dois quadrados 'fechados' (= muito curto)k↑1⌽1⊖
: remova o anel de zeros extras novamente,⊃,/(g(⍉g←⍳⍴⍵))×
: multiplique por coordenadas e coordenadas transpostas e junte-se para formar uma lista de coordenadas incorretas (e muitos zeros que removemos).×⍴d←
: armazene as coordenadas incorretasd
e, se houver alguma ...:'∘',d
: produza a ∘ seguido pelas coordenadas.fonte