Buscaminas es un juego de computadora popular en el que probablemente hayas perdido el tiempo jugando donde tratas de revelar las celdas que son minas en una cuadrícula rectangular en base a pistas de cuántas minas vecinas tiene cada celda no minera. Y en caso de que no lo hayas jugado, hazlo aquí .
Un ingenioso hecho matemático sobre una cuadrícula Buscaminas (también conocido como tablero) es que:
Un tablero y su complemento tienen el mismo número total de minas . ( Prueba )
Es decir, si tiene una cuadrícula del Buscaminas completamente revelada, la suma de todos los números en esa cuadrícula, es decir, el total de la mina , será igual al total de la mina del complemento de la cuadrícula, que es la cuadrícula donde se ha reemplazado cada mina con una no mía y cada no mía reemplazada por una mina.
Por ejemplo, para la cuadrícula Buscaminas
**1..
34321
*2**1
el total de la mina es 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
El complemento de la cuadrícula es
24***
*****
3*44*
que tiene el mío total 2 + 4 + 3 + 4 + 4 = 17 nuevamente.
Escribir un programa que toma en una rejilla arbitraria Minesweeper en forma de texto, donde *
representa una mina y 1
a través de 8
representar el número de minas adyacentes a una célula no mía. Se puede utilizar .
o 0
o
(espacio) para representar a las células sin vecinos mina, su opción. Puede suponer que la cuadrícula de entrada se marcará correctamente, es decir, cada celda que no sea una mina indicará con precisión el número total de minas inmediatamente adyacentes a ella de forma ortogonal o diagonal.
Su programa debe imprimir el complemento de la red en el mismo formato (con el mismo .
, 0
o
como se esperaba en la entrada).
El código más corto en bytes gana.
- En lugar de un programa, puede escribir una función que tome la cuadrícula de entrada como una cadena e imprima o devuelva la cuadrícula del complemento.
- Una nueva línea final en la entrada o salida está bien, pero no debe haber otros caracteres además de los que forman la cuadrícula.
- Puede suponer que una cuadrícula de 1 × 1 será la entrada más pequeña.
Casos de prueba
Todas las entradas y salidas podrían intercambiarse ya que el complemento del complemento es la cuadrícula original. Las rejillas también se pueden girar para otros casos de prueba.
Entrada:
111
1*1
111
Salida:
***
*8*
***
Entrada:
.
Salida:
*
Entrada:
*11*1.1**1...1***1.....1*****1..........
Salida:
1**2***11*****1.1*******1...1***********
Entrada: ( Ejemplo de cortar el nudo )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Salida:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
fuente
?
aceptable usar un delimitador final (por ejemplo ) en la línea después de la línea final del tablero, o podría tomar el número de líneas de entrada a través de la línea de comando?Respuestas:
Pyth,
3938 bytesPruébelo en línea: demostración
El algoritmo principal es realmente sencillo. Simplemente itero sobre cada celda, tomo el cuadro de 3x3 circundante (o más pequeño cuando la celda está en el borde) e imprimo una estrella o el número de no estrellas en ese cuadro.
Explicación:
fuente
CJam,
5857 bytesLa entrada no debe terminar con un salto de línea. La salida contiene
0
para celdas sin minas cercanas.Pruébelo en línea en el intérprete de CJam .
Idea
Comenzamos rellenando la matriz de entrada con una fila y una columna de asteriscos.
Para la entrada
esto resulta en
Ahora generamos todas las modificaciones posibles que resultan de rotar las filas y columnas 0, -1 o 1 unidades hacia arriba / izquierda:
Descartamos las "ubicaciones de relleno" de cada rotación, es decir,
y formar una matriz única concatenando los caracteres correspondientes de cada rotación:
El primer personaje de cada posición es su personaje original.
Si no es un asterisco, debe reemplazarse con un asterisco.
Si es un asterisco, el número de no asteriscos en esa cadena es el número de minas vecinas.
Cómo funciona
fuente
Ruby, 119
Sin golf en el programa de prueba:
fuente
Octava, 76
Explicación
Convierta una cadena de entrada en una matriz de cadenas usando
strsplit
ycell2mat
.Obtenga la matriz lógica que contiene
1
donde no hay*
en la matriz original.Tome su convolución con una matriz 3x3 de 1's.
Enmascararlo con la matriz lógica inversa y colocarlo
*
en lugar de la máscara.Nota: Las celdas sin vecinos de mina se representan como
0
.Ejecución
fuente