Su objetivo es verificar si un tablero de Buscaminas completo es válido. Esto significa que cada número es un recuento correcto de minas en las celdas adyacentes, incluidas las diagonales. El tablero no se envuelve.
Como de costumbre , debe asignar una función o programa, y gana el código más corto en bytes.
Vea también los desafíos pasados para generar , resolver e implementar completamente Buscaminas.
Entrada:
Una sola cadena como esta: 02X2 13X2 X211
.
Las filas del tablero del buscaminas se dan separadas por espacios. Entonces, lo anterior representa el tablero 3x4:
02X2
13X2
X211
Cada celda es un carácter:
X
para una mina, o un número a0
través8
.Todas las filas tienen la misma longitud.
Hay al menos 3 filas y 3 columnas.
La entrada no comienza o termina con un espacio, pero puede incluir una nueva línea al final si lo desea.
Salida:
Una Verdad consistente en tableros correctos, y un valor Falsey consistente en tableros incorrectos. Consistente significa que todas las salidas de Truthy son iguales y todas las salidas de Falsey son iguales.
Casos de prueba
Cada línea es un caso de prueba separado.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
fuente
Respuestas:
Python 2,
132 129128Solía
enumerate
en un campo de golf ... e inclusorange
en otro lugar del mismo programa. Claramente algo está mal aquí.Editar: Iterar
dict(enumerate(s))
más queenumerate(s)
, por lo queenumerate
no es necesario llamarlo dos veces.fuente
~
! Y de diccionarios para hacer que la indexación fuera de límites funcione correctamente.~
operador, irónicamente, me hizo notar que lo estaba usando dos veces sin ningún motivo, donde usarlo solo una vez obviamente lograría lo mismo. Pensé que la parte del diccionario era divertida, gracias.Pyth, 43
Probarlo aquí .
Explicación:
Jhxzd
: Esta es la ubicación del primer espacio en la entrada + 1. (z
en la entrada,d
es espacio). Es la separación en la entrada entre celdas verticalmente adyacentes en el tablero.!f
: Este es el no lógico (!
) de un filtro (f
), que seráTrue
si y solo si la expresión es falsa para cada elemento de la secuencia.-@zT
: Tome el carácter en la ubicaciónT
(la variable lambda) de la entrada y elimine cualquier aspecto de: (Esto será verdadero si el carácter no se elimina y falso si lo es.+" X"
: Eliminar espacio, X y`
: Repr desm
: suma del mapa a/ \X
: recuento de "X" en:+*JNz
: El segmento de la entrada con el prefijo deJ
caracteres ficticiostd+d2
: De d-1 a d + 2.m+T*kJU3
: Para d en [T, T + J, T + 2 * J].Uz
Para T enrange(len(input))
.fuente
APL (NARS2000) (74)
También funciona en Dyalog APL si
⎕ML
está configurado en3
.Explicación:
⊃⍵⊂⍨⍵≠' '
: dividir⍵
en los espacios y utilizar las listas para formar una matriz.G←¯1+⎕D⍳
: encuentre el índice en⎕D
cada valor, reste 1 y almacene esto enG
. (⎕D
contiene los dígitos, cualquier no dígito se convertirá en10
).Z←G↑⍨2+⍴G
: agregue dos líneas y columnas de ceros en el borde de la matriz, para tratar el envolvente{
...}¨⍳⍴Z
: para cada posición enZ
, encuentre la cantidad de bombas en el vecindario de Moore de esa posición:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: gire a laZ
izquierda, derecha, arriba, abajo, izquierda-arriba, derecha-arriba, izquierda-abajo y derecha-abajo.⍵∘⌷¨
: para cada uno de estos, encuentre el elemento⍵
en cada una de estas matrices rotadas+/∊9<
: cuenta cuántos elementos son superiores a 9 (esta es la cantidad de bombas).(⍴G)↑
: elimine las líneas agregadas de ceros nuevamente,G=
: comprueba si cada elemento enG
es igual a la cantidad de bombas que rodean esa posición (esto debería ser cierto para todos los cuadrados que no son bombas),(G>9)∨
: y compruebe si los elementos enG
son más altos que9
(estas son las bombas).~0∊
: devuelve1
si la matriz resultante no contiene ceros (= todos los cuadrados son bombas o el número correcto), y0
si lo tiene.fuente
C #,
321 320305Primero intento jugar al golf, y sé que C # no es el lenguaje ideal.
Espero que se permita escribir un método de instancia, de lo contrario agregue otros 7 caracteres para
static
.Espaciado:
Usar Linq ahorra algo de espacio en comparación con los bucles for, pero es más difícil de depurar.
Aprendí algunas cosas como convertir
char => int
restando'0'
.Parecía más simple rellenar el tablero con espacios, por lo que iterar sobre él sería más fácil.
fuente
-'0'
por-48
? Funciona para mí y guarda algunos bytes para varias 'X' y ''Pitón 2, 121
Esto está fuertemente inspirado por la respuesta de feersum . El orden del día es excesivo: en lugar de buscar minas en los 9 vecinos de la celda, verifique cada celda para ver si es una mina vecina.
Verificamos si dos celdas son vecinas
2>r>-2<c<2
, donder
yc
son las diferencias de fila y columna de las celdas, equivalentes a{r,c}<{-1,0,1}
. Estas coordenadas se calculan a partir de los índices de celdaI
yi
comoc=I%n-i%n
yr=I/n-i/n
. Es más eficiente indexar directamente en la cadena y extraer filas y columnas que convertirlo en un objeto 2D como una lista de listas. La verificación de la mina esB[i]>'W'
equivalente aquí aB[i]=='X'
.El uso
enumerate
habría salvado dos caracteres sobre lo feo,range(len(B))
excepto que devuelve un objeto iterador que no admite dos bucles anidados a través de él.fuente
~B.find
./
porque redondea los negativos también hacia abajo.Pitón 2, 140
fuente
JavaScript (ES6),
135133125122Proporcione entrada a la función como una cadena:
Para una explicación, vea la versión anterior, a continuación. La nueva versión reemplaza los
for
bucles conevery
llamadas y usa la variablee="every"
para hacer ensomeArray[e](...)
lugar desomeArray.every(...)
.Además, el contador
k
ahora está indexado1
para que lak+=...
expresión sea siempre verdadera, a fin de mantener elevery
ciclo en ejecución. Eliminamos ese extra1
restando eltrue
resultado (que coacciona numéricamente1
) devuelto por laevery
operación[-1,0,k=1][e](...)
.Versión antigua:
Código con espacios y comentarios:
El
every
método de matriz de JavaScript toma una devolución de llamada y aplica la devolución de llamada a cada elemento de la matriz. Si alguna devolución de llamada devuelve un valor falso, laevery
llamada vuelvefalse
.Los booleanos en JS se convierten a 1 o 0 cuando forman parte de una adición. Para cada espacio circundante, "agregamos" el resultado booleano de comparar su valor
X
y luego agregamos ese valor al contadork
en la expresiónk += (... == "X")
. Por lo tanto,k
contiene un recuento del número deX
s circundantes , porquetrue
cuenta como1
yfalse
cuenta como0
.fuente
c=="X"
intentarlo!c/1
, lo que le ahorra una gran cantidad de un par de bytes! Si falla, inténtalo!!c/1
. El razonamiento es eso'X'/1 => NaN
, yNaN
es falso. Comprueba sic=='X'
, ¿por qué no intentas comprobar si no es asífalse
?(!c)/1
que, desafortunadamente, no ayuda; Necesito tener los paréntesis para!(c/1)
, que cuestan 2. Además,0/1
es falsey, por lo que la entrada no válida "0X
" tendría el resultado incorrectotrue
. Lo mejor que puedo hacer sin dejar de respetar los ceros es combinar las dos condiciones en una frase negada, como!(+c+1&&k-c)
, pero esa es la misma longitud que ya tengo.!(k-1-c)
prueba ambas condiciones, porque sik
coincidec
(menos el desplazamiento 1), entonces la negación se0
cumple, y sic
no es un número, obtenemosNaN
la negación es tambiéntrue
.CJam,
70 6563 bytesEsto se puede jugar mucho al golf.
Da
1
por un tablero válido y0
por un tablero no válido.Casos de prueba
Entrada
Salida
Pruébalo en línea aquí
fuente
JavaScript (ES6) 98
Usando algunos para aplicar una función a cada carácter de la cadena.
La función vuelve
El control interno se realiza utilizando el mapa solo porque es más corto que para Cada
algunos devuelve verdadero en el primer valor verdadero (en este caso, distinto de cero), lo que significa una comprobación fallida. El resultado se niega para dar un verdadero / falso más reconocible.
Prueba en la consola FireFox / FireBug
Salida
fuente
R, 156 caracteres
Con sangrías, espacios y saltos de línea, para legibilidad:
Ejemplos:
fuente