0h n0 é um jogo muito simples e agradável, um pouco como o Sudoku ou o caça-minas.
Regras do jogo
(Eu recomendo usar o tutorial no jogo, se puder, é muito simples e útil)
O quebra-cabeça começa com um n * n
tabuleiro contendo algumas peças fixas e algumas células vazias, e o solucionador deve encontrar uma maneira de preencher as células vazias com peças e satisfazer todas as restrições impostas pelas peças fixas. Aqui estão os tipos de peças que usaremos com a abreviação:
#
Peça vermelha (vista em bloco de uma peça azul)O
Peça azul.
Local vazionumber
Peça azul numerada (number
é um número de um dígito> 0)
Todas as peças numeradas devem ver exatamente a mesma quantidade de peças azuis que o número. Por exemplo:
#1O#O
...O.
A 1
peça pode ver apenas uma outra peça azul.
Como as peças se vêem
Duas peças azuis podem se ver se estiverem na mesma linha ou coluna e nenhuma peça vermelha estiver entre elas. Exemplo:
( S
é um local que a O
peça pode ver, X
não pode ser vista)
S
S
X#SOSS
#
X
Cada peça azul deve ver pelo menos uma outra peça azul:
#O#
Não vai funcionar, mas:
#OO
Ou:
###
Faça trabalho.
Placa de demonstração resolver
.1..
..1.
....
22#2
O canto inferior direito 2 só pode ver acima de si, portanto deve ser azul e o canto superior direito deve ser vermelho.
.1.#
..1O
...O
22#2
Uma vez que o 1
é preenchido, podemos cercá-lo com pedaços vermelhos.
.1##
.#1O
..#O
22#2
A parte superior esquerda 1
só pode ver em uma direção agora, para que possamos preenchê-la.
O1##
.#1O
..#O
22#2
Agora, sobre os últimos 2
s. Podemos colocar 2 peças azuis sobre eles.
O1##
.#1O
OO#O
22#2
O último será preenchido com #
O1##
##1O
OO#O
22#2
Entrada
Entrada é uma sequência de linhas múltiplas. O tamanho será 9x9
sem espaço à direita. Possui os seguintes tipos de peças:
.
Esvaziar#
Predefinido em vermelho, não pode ser alteradonumber
Número predefinido, não pode ser alterado
(Observe que o azul nunca estará na entrada)
Resultado
A saída é igual à entrada, com a mudança de vazio ( .
) é substituído por vermelho ou azul para resolver o quadro e os números são substituídos por peças azuis ( O
).
Exemplos
(Observe que várias soluções podem ser possíveis para cada quebra-cabeça, mas você só precisa mostrar uma)
Input:
........4
...3.1...
45...2.3.
..9......
1..6#44..
....4..5.
....4.36.
2.......6
1....4...
Output:
OOO###OOO
OOOO#O#OO
OOO#OO#OO
#OOOO#O##
O#OO#OOOO
O#OOOO#OO
#OOOO#OOO
OO#O#OOOO
O#OOOO#O#
Input:
..7..#...
#...8..11
2....5...
..5...48.
...#...4.
.5...6...
...1.2...
2.....6.8
.7..#....
Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O
Input:
5.3..33..
...4...23
.6.6.34..
...3#....
....5..4.
.5....3..
7.98.6#.3
.5.6..2..
..6...2..
Output:
OOOOO####
##OOOO#OO
O#OOOO###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#O#O#OO
OO#OOOOOO
OOO###O#O
Obrigado a @PeterTaylor e @apsillers por toda a ajuda na caixa de areia!
fonte
Respostas:
Haskell, 224 bytes
Não foi totalmente testado, porque é muito lento (pelo menos
O(n*2^n^2)
).Explicação:
A idéia básica é representar um quadro de
Red, Blue
peças como uma lista de listas de0, 1
, onde a lista de listas é compactada em um único número inteiro para facilitar a enumeração. Todos esses números inteiros para o tamanho da placa são gerados e convertidos em um formulário com contagens de vizinhos. A primeira placa desse tipo que é uma solução válida da entrada é retornada.A parte que provavelmente poderia ser mais golfed é:
and.map and$zipWith(zipWith(%))
. Caso contrário, eu peguei alguns erros que adicionavam comprimento e provavelmente poderiam ser mais jogados.fonte