¡No debe confundirse con la contraseña Bishop Goodness !
Dada una cadena, responda (verdadero / falso o dos valores consistentes) si constituye una contraseña fuerte contra los obispos .
Una contraseña es segura contra los obispos si es una cadena que consiste en alternar letras (in a-h
) y dígitos (in 1-8
) de modo que cada par de caracteres se pueda interpretar como un cuadrado en un tablero de ajedrez, y si coloca un peón blanco en cada cuadrado llamado en la contraseña, entonces no hay forma de que un alfil blanco viaje, en cualquier número de movimientos consecutivos, desde cualquier casilla en la primera 1
fila ( ) a cualquier casilla en la última 8
fila ( ).
Ejemplos
Contraseñas seguras contra los obispos
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Por ejemplo,
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
corresponde a la posición yb4b5d4d5f4f5g3h5
corresponde a la posición
Contraseñas débiles contra los obispos
a4c4e4g4g5d6f6e3d2b2
(bien formado pero no fuerte, ¡gracias Jo King por este ejemplo!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(bien formado pero no fuerte)h4g4f4e4c4b4a4c3
(bien formado pero no fuerte)d4
(bien formado pero no fuerte)b4b5d4d5f4f5g2h5
(bien formado pero no fuerte)correct horse battery staple
(mal formado)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(mal formado)a
(mal formado)aa
(mal formado)
fuente
1
a través8
de la primera prueba? No puede viajar a cada columna, ya que laa
columna está completamente llena de peones, pero puede viajar a cada fila sin problemas, ¿no? Tengo la sensación de que me falta algo ...: SRespuestas:
Ruby,
115182163 bytesPruébalo en línea!
Retornos
1
para fuertes ynil
para débiles. (Los +67 bytes fueron para tener en cuenta el "retroceso").Algunos trucos que se usaron:
En lugar del rango numérico
0..99
, usamos el rango de cadena'00'..'99'
para que el número se rellene automáticamente a la izquierda a 2 dígitos y se stringifique. Esto hace que la comprobación fuera de los límites sea muy corta: coincide con la expresión regular/[09]/
.Dentro de la función auxiliar, mientras que la construcción de la lista de las nuevas coordenadas
[x-11, x-9, x+9, x+11]
, que al mismo tiempo asignamosz[x]
a9
en el proceso, que pasa a ser un valor Truthy (marcando la casilla visitado).En la última línea, queremos comprobar que la matriz
z[81,9]
no contiene9
. Hacemos esto eliminando todas las instancias de9
(z[81,9]-[9]
), luego preguntando por el noveno elemento de la matriz resultante ([8]
). Como sabemos que la matriz originalmente tenía 9 elementos, si se eliminó alguno, obtendremosnil
, mientras que si todos permanecieron, obtendremos el último elemento de la matriz (que siempre es1
).fuente
Python 2 ,
330318313309370 bytesPruébalo en línea!
¡Prueba la versión práctica en línea! (el original puede tomar 4 ^ 32 operaciones para verificar completamente, sugiero usar este - el mismo número de bytes)
No es una solución súper corta: no pude descubrir cómo hacer que una versión de la función lambda de g sea más corta que g.
-4 bytes gracias a Quuxplusone
+61 bytes que representan el retroceso (gracias por señalar eso a Jo King y por los consejos de golf)
fuente
q=r=1
sería más corto queq=1 r=1
, ¿verdad? Yif r:
más corto queif r>0:
.Pitón 2 ,
490476474Pruébalo en línea!
Esto funciona por "inundación de relleno". Primero creamos una lista
a
de qué cuadrados son adyacentes a qué otros cuadrados, en sentido obvio. Luego creamos un conjuntox
de exclusiones (basadas en la contraseña). Luego inicializamos un conjuntor
de cuadrados alcanzables, que comienza como la primera fila (menos cualquier exclusión), y repetidamente "inundamos" hacia afuera desde allí, 99 veces, lo que debería ser más que suficiente. Finalmente, probamos para ver si alguno de los cuadrados en la última fila terminó en nuestro conjunto accesible. Si es así, ¡tenemos una contraseña débil! Si no, tenemos una contraseña segura.Desventaja, tal vez descalificante (no sé la regla habitual aquí): si la contraseña está mal formada (como "grapa de batería de caballo correcta"), lanzamos una excepción en lugar de devolverla
False
. ¡Pero siempre devolvemosTrue
si la contraseña es segura!Menos 16 bytes gracias a Jo King. Nos alineamos
a
en el único lugar donde se usa, y doblamos constantemente algunas matemáticas.fuente
for
s que no pude ver cómo eliminar. Descubrí que reemplazarrange(99)
conrepr(f)
trabajos en mi máquina local pero no en el intérprete de tio.run ... ¡pero descubrí que[1]*99
era más corto de todos modos! Entonces eso ahorró 4 bytes más.for
s que no pude ver cómo eliminarlos - ¡Oh! Aparentemente, Python trata33for
como dos tokens (mientrasfor33
que sería un token). Hoy aprendí. Menos 2 bytes más, entonces.Limpio , 285 bytes
Pruébalo en línea!
$[]
se$ :: [[Int]] [Char] -> Bool
compone con el primer argumento, dando\ [Char] -> Bool
.La función funciona al consumir la cadena de dos caracteres a la vez, devolviendo inmediatamente falso si la cadena está en un formato no válido tan pronto como ve la parte no válida. Una vez que la cadena ha sido procesada, coloca un alfil en cada casilla vacía a un lado del tablero y los mueve de todas las formas posibles 64 veces y comprueba si alguna de las posiciones finales está en la fila objetivo.
fuente
True
paraa1b1c1d1e1f1g1
? No es que entienda nada sobre cómo funciona. :)Wolfram Language (Mathematica) ,
339316358353345 bytes-23 bytes gracias a @Doorknob.
+42 bytes que representan el retroceso.
Pruébalo en línea!
Reescribí la mayor parte de esto para dar cuenta del retroceso, creo que puede haber una manera más fácil de definir el gráfico
g
, Mathematica tieneGraphData[{"bishop",{8,8}}]
cuál es el gráfico de todos los movimientos que un obispo puede hacer en un tablero de ajedrez ( Bishop Graph ), pero este gráfico incluye conexiones adicionales que el vecino diagonal más cercano. Si alguien conoce una forma más corta de hacerlo, hágamelo saber. El crédito por la construcción del gráfico corresponde a esta respuesta de MathematicaSE .Devoluciones
True
para contraseñas seguras,False
para contraseñas débiles / mal formadas. Tenga en cuenta que para la mayoría de las contraseñas mal formadas producirá un montón de mensajes de error y luego regresaráFalse
. Si esto no está en línea con las reglas, se pueden suprimir cambiandof[n_]:=...
a unf[n_]:=Quiet@...
costo de 6 bytes.Sin golf:
Descompostura:
Toma un argumento de cadena y lo divide en una lista de cadenas cada una de longitud
m
.Devuelve
False
si se producen mensajes de error, que es la forma en que captamos las cadenas mal formadas (es decir, supongamos que están bien formadas, lo que inevitablemente produce un error en la línea).Toma la cadena de posiciones de peón y la divide de tal manera que se
"a2h5b"
convierte{{"a","2"},{"h","5"},{"b"}}
, luegoLetterNumber
convierte la letra en un número (a -> 1
, etc.) yFromDigits
convierte el número en un entero. Si la cadena no está bien formada, este paso producirá un error que será atrapado alCheck
regresarFalse
. Estos dos números se convierten en un número entero correspondiente a un cuadrado en el tablero.Construye el gráfico de todos los bordes diagonales del vecino más cercano con las posiciones de peón eliminadas.
Estas son listas de vértices iniciales y finales desocupados respectivamente
Recorre los vértices iniciales y finales, para cada par
FindPath
habrá una lista de caminos entre ellos. Si no hay caminos entre ellos, será una lista vacía, por lo queLength@
regresa0
. Si no hay rutas en absoluto,m
será cero, y volveremosTrue
, de lo contrario regresaremosFalse
.fuente
True
yFalse
puede ser1>0
y0>1
respectivamente.p[1]@#&/@
es equivalente a justop@1/@
.Sequence@@
puede ser reemplazado con##&@@
. En lugar de{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
, puedes usar{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, pero veo la idea general. Supongop@1 = StringPartition[#,1]&
que es un poco confuso para mí, supongo porquep
toma dos argumentos de dos maneras diferentes, una comom_
y la otra como#...&
, supongo que esto es solo una cuestión de precedencia. Aunque tiene sentido esop@m = p[m]
.f
que tome un solo argumento,f@#&
tenga el mismo comportamiento que simplementef
, aquíf
estáp[1]
. (Luego cambié la[]
notación a@
, que siempre es idéntica excepto por precedencia).