-23 octets grâce à @Doorknob.
+42 octets représentant le retour en arrière.
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]
Essayez-le en ligne!
J'ai réécrit la plupart de cela pour tenir compte du retour en arrière, je pense qu'il peut y avoir un moyen plus facile de définir le graphique g
, Mathematica a GraphData[{"bishop",{8,8}}]
qui est le graphique de tous les mouvements qu'un évêque peut faire sur un échiquier ( Bishop Graph ), mais ce graphique comprend des connexions plus loin que le voisin diagonal le plus proche. Si quelqu'un connaît un moyen plus court de le faire, faites le moi savoir. Le mérite de la construction du graphique revient à cette réponse MathematicaSE .
Renvoie True
les mots de passe forts, les mots de passe False
faibles / mal formés. Notez que pour la plupart des mots de passe mal formés, il produira un tas de messages d'erreur, puis reviendra False
. Si cela n'est pas conforme aux règles, elles peuvent être supprimées en passant f[n_]:=...
à f[n_]:=Quiet@...
6 octets.
Non 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]
Panne:
p[m_]:=StringPartition[#,m]&
Prend un argument de chaîne et le divise en une liste de chaînes de longueur chacune m
.
Check[...,False]
Renvoie False
si des messages d'erreur sont produits, c'est ainsi que nous interceptons les chaînes mal formées (c'est-à-dire supposons qu'elles sont bien formées, produisant inévitablement une erreur sur toute la ligne).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Prend la chaîne de positions de pion et la divise telle qu'elle "a2h5b"
devient {{"a","2"},{"h","5"},{"b"}}
, puis LetterNumber
convertira la lettre en un nombre ( a -> 1
, etc.) et FromDigits
convertit le chiffre en entier. Si la chaîne n'est pas bien formée, cette étape produira une erreur qui sera interceptée en Check
retournant False
. Ces deux nombres sont ensuite convertis en un entier correspondant à un carré du tableau.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Construit le graphique de toutes les arêtes diagonales du plus proche voisin avec les positions de pion supprimées.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Ce sont des listes de sommets de début et de fin inoccupés, respectivement
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Boucles sur les sommets de début et de fin, pour chaque paire FindPath
sera une liste de chemins entre eux. S'il n'y a pas de chemin entre eux, ce sera une liste vide, donc Length@
retourne 0
. S'il n'y a aucun chemin, alors m
sera zéro, et nous reviendrons True
, sinon revenons False
.