Um nonograma é um quebra-cabeça lógico bidimensional que se parece com isso (capturas de tela do jogo Pixelo , meu jogo favorito do nonograma):
O objetivo do jogo é descobrir qual imagem esses números estão codificando. As regras são simples: um número em uma coluna ou linha significa que em algum lugar dessa coluna ou linha, muitas caixas são preenchidas em uma linha. Por exemplo, a linha inferior na imagem acima não deve ter caixas preenchidas, enquanto a linha acima deve ter todas as caixas preenchidas. A terceira linha da parte inferior tem 8 caixas preenchidas e todas elas serão seguidas.
Dois ou mais números para a mesma coluna ou linha significam que existem várias "execuções" de caixas preenchidas, com pelo menos um espaço entre esses comprimentos. O pedido é preservado. Por exemplo, há três caixas preenchidas na coluna direita da imagem acima, pelo menos um espaço abaixo delas e mais uma caixa preenchida.
Aqui está o mesmo quebra-cabeça, quase completo:
(Os Xs não são importantes, são apenas uma dica que o jogador deixa para dizerem "Este quadrado definitivamente não está preenchido". Pense em bandeiras no Campo Minado. Eles não têm significado para as regras.)
Felizmente, você pode ver que, por exemplo, as colunas do meio com dicas que dizem "2 2" têm duas execuções de 2 comprimentos de caixas preenchidas.
Sua missão, caso você aceite, é escrever um programa ou função que criará um quebra-cabeça como esse. Você recebe o tamanho do quadro como um único número inteiro (5 <= n <= 50) no stdin ou como argumento (não há razão para que um quebra-cabeça que não seja do programa deve ser quadrado, mas, para esse desafio, será). Depois disso, você receberá uma série de 1s e 0s representando quadrados preenchidos e não preenchidos na imagem, respectivamente. O primeiro n deles é a linha superior, depois a próxima linha, etc. Você retornará ou imprimirá um stdout de uma placa de 2 * 1 células (porque elas ficam melhores e oferecem espaço para dicas de dois dígitos para uma coluna ), todos vazios, com dicas correspondentes aos dados de entrada.
Formato de saída
Amostra
Entrada:
./nonogram <<< '5 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0'
OR
n(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
Imagem:
Saída:
1
2 1 2
3 2 1 2 3
+----------
3|
2 2|
1 1 1|
2 2|
3|
Entrada:
./nonogram <<< '15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1'
Imagem:
Saída:
1 1
1 1 3 3 5 5 3 3 1
7 2 3 2 4 2 3 210 2 3 0 4 215
+------------------------------
2|
1|
1|
1|
1|
1 1|
3 3 1 1|
1 5 1 1|
3 5 3|
1 5 1|
1 3 1|
1 1 1 1 1|
1 1 1 1 1 1 1 1|
11 3|
11 3|
Esclarecimentos
- Sua saída não precisa ser um quebra-cabeça solucionável. Nem todos os nonogramas são solucionáveis, mas essa não é sua preocupação. Basta emitir as dicas que correspondem à entrada, sejam elas um bom quebra-cabeça ou não.
- É permitido um programa que aceita argumentos na linha de comando. É o tipo de afirmação acima, mas é possível ter uma idéia errada. É para isso que servem os esclarecimentos.
0
É obrigatório imprimir um para uma linha ou coluna que não tenha caixas preenchidas. Não digo isso com palavras em nenhum lugar, mas nos dados da amostra.
5<=n<=50
é a especificação, por isso, não pode haver qualquer número de 3 dígitos-
do que deveria?Respostas:
GolfScript, 128 caracteres
A entrada deve ser fornecida no STDIN como números separados por espaço.
Você pode testar o exemplo aqui .
Código comentado:
fonte
~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n](
(por algum motivo, lettercount.com diz 125 caracteres se você o copiar, mas garanto que são 123 caracteres). Algumas partes do algoritmo foram alteradas, mas a maioria ainda é a mesma. Também mudei alguns nomes de variáveis (ter 9 como variável é inteligente, mas também confuso), mas você pode alterá-los novamente, se quiser.Ruby, 216
255Embora isso não produza a amostra exata de saída dada na pergunta, ela segue as especificações. A única diferença para os exemplos é que eu imprimo alguns espaços / novas linhas.
Exemplo:
Changelog:
chunk
paramap
.[nil]
vez de chamarArray#compact
.fonte
length(leading spaces + numbers to the left) == 2*n
eheight(leading newlines + numbers at the top) == n
... portanto, desde que o seu monitor seja grande o suficiente para3*n+1 × 2*n+2
caracteres, você não precisará desqualificar-me. :)Ruby, 434
fonte
ruby $yourprogram <<< $input
mas conseguiruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError)
.ruby nonogram.rb 2 1 0 0 1
para um 2x20
a quarta quarta coluna no segundo exemplo.+------
linha ... também é recuada por muitos espaços.GolfScript
149147O código
Edições:
puts
salvar mais um caractereDemos online
Uma versão um pouco anotada do código
fonte
Javascript (E6) 314
334 357 410Ungolfed
Uso
N(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])
N(15,[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1])
Editar histórico
1 Removido o regexp usado para encontrar colunas
. O Overkill 2 Simpler é melhor. Saída para uma sequência, não para uma matriz. Função auxiliar removida FILL (F)
3 Ainda mais simples. Eu não posso fazer melhor que isso. Ainda não se pode comparar com o Golfscript :(
fonte
R, 384 caracteres
Com recuos e algumas explicações:
Uso:
fonte
C - 511
Definitivamente, o C não foi feito para formatar bem a saída. A contagem de caracteres inclui apenas os espaços necessários / novas linhas.
A entrada é de STDIN, números separados por espaços.
fonte
Já faz alguns dias e ninguém respondeu em python, então aqui está minha (provavelmente muito pobre) tentativa:
Python 2.7 -
404397380 bytesVou postar uma versão não-gasta em breve, mas no momento acho que é bem legível. :)EDITAR: Enquanto escrevia a versão desregrada, notei algumas melhorias que eu poderia fazer que se somavam bastante significativas! Por alguma razão que não sei explicar, ele agora possui novas linhas adicionais na parte superior e espaços à esquerda (embora eu ache que não mudei nada funcional), mas ainda atende às especificações.
Versão ungolfed está chegando!Ungolfed:
Algumas alterações foram feitas para facilitar a leitura (
g
sendo divididas em três funções nomeadas, compreensões complexas de listas transformadas emfor
loops), mas logicamente funciona exatamente da mesma maneira.É por isso que é confuso que este não imprima espaços extras e novas linhas, enquanto o golfe o faz. ¯ \ _ (ツ) _ / ¯
fonte