-23 bytes graças a @Doorknob.
+42 bytes, representando retorno.
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]
Experimente online!
Eu reescrevi a maior parte disso para dar conta do retorno, acho que pode haver uma maneira mais fácil de definir o gráfico g
, o Mathematica possui GraphData[{"bishop",{8,8}}]
o gráfico de todos os movimentos que um bispo pode fazer em um tabuleiro de xadrez ( Bishop Graph ), mas esse gráfico inclui conexões adicionais que o vizinho diagonal mais próximo. Se alguém souber uma maneira mais curta de fazer isso, me avise. O crédito pela construção do gráfico vai para esta resposta do MathematicaSE .
Retorna True
para senhas fortes, False
para senhas fracas / mal formadas. Observe que, para a maioria das senhas mal formadas, ela produz um monte de mensagens de erro e depois retorna False
. Se isso não estiver de acordo com as regras, elas poderão ser suprimidas alterando f[n_]:=...
para o f[n_]:=Quiet@...
custo de 6 bytes.
Ungolfed:
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]
Demolir:
p[m_]:=StringPartition[#,m]&
Pega um argumento de string e o divide em uma lista de strings cada uma de comprimento m
.
Check[...,False]
Retorna False
se alguma mensagem de erro for produzida, e é assim que capturamos as seqüências mal formadas (ou seja, presumimos que elas sejam bem formadas, inevitavelmente produzindo um erro abaixo da linha).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Pega a sequência de posições dos peões e a divide de maneira que "a2h5b"
se torne {{"a","2"},{"h","5"},{"b"}}
, depois LetterNumber
converterá a letra em um número ( a -> 1
, etc) e FromDigits
converterá o numeral em um número inteiro. Se a string não estiver bem formada, esta etapa produzirá um erro que será detectado pelo Check
retorno False
. Esses dois números são então convertidos em um número inteiro correspondente a um quadrado no quadro.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Constrói o gráfico de todas as arestas diagonais do vizinho mais próximo com as posições do peão excluídas.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Estas são listas de vértices iniciais e finais desocupados, respectivamente
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Loops nos vértices inicial e final, para cada par FindPath
, haverá uma lista de caminhos entre eles. Se não houver caminhos entre eles, será uma lista vazia, então Length@
retornará 0
. Se não houver caminhos, m
será zero e retornaremos True
, caso contrário, retornaremos False
.