-23 bytes gracias a @Doorknob.
+42 bytes que representan el retroceso.
p[m_]:=StringPartition[#,m]&;l=Range@8;f[n_]:=Check[w=(8#2+#1-8)&@@@({LetterNumber@#,FromDigits@#2}&@@@(p@1/@p[UpTo@2]@n));g=Graph[Sort/@UndirectedEdge@@@Position[Outer[EuclideanDistance@##&,#,#,1],N@Sqrt@2]&@GraphEmbedding@GridGraph@{8,8}//Union]~VertexDelete~w;c:=#~Complement~w&;m=0;Do[m+=Length@FindPath[g,i,j],{i,c@l},{j,c[l+56]}];m==0,0>1]
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 tiene GraphData[{"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 cambiando f[n_]:=...
a un f[n_]:=Quiet@...
costo de 6 bytes.
Sin golf:
p[m_] := StringPartition[#, m] &;
f[n_] :=
Check[
w = (8 #2 + #1 -
8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
r = GridGraph[{8, 8}];
g = Graph[Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],N@Sqrt@2] &@
GraphEmbedding@r // Union]~VertexDelete~w;
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
m = 0;
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
, False]
Descompostura:
p[m_]:=StringPartition[#,m]&
Toma un argumento de cadena y lo divide en una lista de cadenas cada una de longitud m
.
Check[...,False]
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).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Toma la cadena de posiciones de peón y la divide de tal manera que se "a2h5b"
convierte {{"a","2"},{"h","5"},{"b"}}
, luego LetterNumber
convierte la letra en un número ( a -> 1
, etc.) y FromDigits
convierte el número en un entero. Si la cadena no está bien formada, este paso producirá un error que será atrapado al Check
regresar False
. Estos dos números se convierten en un número entero correspondiente a un cuadrado en el tablero.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Construye el gráfico de todos los bordes diagonales del vecino más cercano con las posiciones de peón eliminadas.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Estas son listas de vértices iniciales y finales desocupados respectivamente
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
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 que Length@
regresa 0
. Si no hay rutas en absoluto, m
será cero, y volveremos True
, de lo contrario regresaremos False
.