O Campo Minado é um popular jogo de computador que você provavelmente perdeu tempo jogando, ao tentar revelar as células que são minas em uma grade retangular, com base em dicas de quantas minas vizinhas cada célula não-mina possui. E caso você não tenha jogado, faça-o aqui .
Um fato matemático interessante sobre uma grade do Campo Minado (aka placa) é que:
Uma placa e seu complemento têm o mesmo número total da mina . ( Prova )
Isto é, se você tiver uma grade do Campo Minado completamente revelada, a soma de todos os números nessa grade, ou seja, o total da mina , será igual ao total da mina do complemento da grade, que é a grade na qual todas as minas foram substituídas por um não-mineiro e todo não-mineiro substituído por um.
Por exemplo, para a grade Campo Minado
**1..
34321
*2**1
o total da mina é 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
O complemento da rede é
24***
*****
3*44*
que tem o meu total 2 + 4 + 3 + 4 + 4 = 17 novamente.
Escreva um programa que leva em uma grade Minesweeper arbitrário em forma de texto, onde *
representa uma mina e 1
através 8
representam o número de minas adjacentes a uma célula não meu. Você pode usar .
ou 0
ou
(espaço) para representar células sem vizinhos de minas, sua escolha. Você pode assumir que a grade de entrada será marcada corretamente, ou seja, cada célula que não é da mina denotará com precisão o número total de minas imediatamente adjacentes a ela, ortogonal ou diagonalmente.
Seu programa precisa imprimir o complemento da grade no mesmo formato (usando o mesmo .
, 0
ou
como você esperava na entrada).
O código mais curto em bytes vence.
- Em vez de um programa, você pode escrever uma função que pega a grade de entrada como uma string e imprime ou retorna a grade do complemento.
- Uma nova linha à direita na entrada ou saída é boa, mas não deve haver outros caracteres além daqueles que formam a grade.
- Você pode assumir que uma grade 1 × 1 será a menor entrada.
Casos de teste
Todas as entradas e saídas podem ser trocadas, pois o complemento do complemento é a grade original. As grades também podem ser giradas para outros casos de teste.
Entrada:
111
1*1
111
Saída:
***
*8*
***
Entrada:
.
Saída:
*
Entrada:
*11*1.1**1...1***1.....1*****1..........
Saída:
1**2***11*****1.1*******1...1***********
Entrada: ( exemplo Cut The Knot )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Saída:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
fonte
?
) na linha após a linha final do quadro é aceitável ou posso levar o número de linhas de entrada pela linha de comando?Respostas:
Pitão,
3938 bytesExperimente online: Demonstração
O algoritmo principal é realmente simples. Eu simplesmente itero sobre cada célula, pego a caixa 3x3 ao redor (ou menor quando a célula está na borda) e imprimo uma estrela ou o número de não estrelas nessa caixa.
Explicação:
fonte
CJam,
5857 bytesA entrada não deve terminar com um avanço de linha. A saída contém
0
células sem minas próximas.Experimente online no intérprete CJam .
Idéia
Começamos preenchendo a matriz de entrada com uma linha e uma coluna de asteriscos.
Para entrada
isto resulta em
Agora, geramos todas as modificações possíveis resultantes da rotação das linhas e colunas 0, -1 ou 1 unidades para cima / esquerda:
Descartamos os "locais de preenchimento" de cada rotação, ou seja,
e forme uma única matriz concatenando os caracteres correspondentes de cada rotação:
O primeiro caractere de cada posição é seu caractere original.
Se for um não-asterisco, deverá ser substituído por um asterisco.
Se for um asterisco, o número de não asteriscos nessa cadeia é o número de minas vizinhas.
Como funciona
fonte
Ruby, 119
Sem jogar no programa de teste:
fonte
Oitava, 76
Explicação
Converta a string de entrada na matriz de strings usando
strsplit
ecell2mat
.Obtenha a matriz lógica que contém
1
onde não há*
na matriz original.Tome sua convolução com uma matriz 3x3 de 1's.
Mascare-o com a matriz lógica inversa e coloque-o
*
no lugar da máscara.Nota: Células sem vizinhos de minas são representadas como
0
.Execução
fonte