-23 byte grazie a @Doorknob.
+42 byte che rappresentano il backtracking.
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]
Provalo online!
Ho riscritto la maggior parte di questo per tenere conto del backtracking, penso che potrebbe esserci un modo più semplice per definire il grafico g, Mathematica ha GraphData[{"bishop",{8,8}}]quale è il grafico di tutte le mosse che un vescovo può fare su una scacchiera ( Bishop Graph ), ma questo grafico include ulteriori connessioni rispetto al vicino diagonale più vicino. Se qualcuno conosce un modo più breve per farlo, fammelo sapere. Il merito per la costruzione del grafico va a questa risposta MathematicaSE .
I ritorni Trueper password complesse, Falseper deboli / password malformati. Si noti che per la maggior parte delle password malformate produrrà un sacco di messaggi di errore e quindi ritornerà False. Se questo non è in linea con le regole, possono essere soppresse passando f[n_]:=...a f[n_]:=Quiet@...costare 6 byte.
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]
Abbattersi:
p[m_]:=StringPartition[#,m]&
Accetta un argomento stringa e lo divide in un elenco di stringhe ciascuna di lunghezza m.
Check[...,False]
Restituisce Falsese vengono prodotti messaggi di errore, che è il modo in cui catturiamo le stringhe non formate (ovvero supponiamo che siano ben formate, producendo inevitabilmente un errore lungo la linea).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Prende la stringa di posizioni di pedone e la divide in modo che "a2h5b"diventi {{"a","2"},{"h","5"},{"b"}}, quindi LetterNumberconverte la lettera in un numero ( a -> 1, ecc.) E FromDigitsconverte il numero in un numero intero. Se la stringa non è ben formata, questo passaggio produrrà un errore che verrà intercettato Checke restituito False. Questi due numeri vengono quindi convertiti in un numero intero corrispondente a un quadrato sul tabellone.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Crea il grafico di tutti i bordi diagonali del vicino più vicino con le posizioni del pedone eliminate.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Questi sono elenchi di vertici iniziali e finali non occupati rispettivamente
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Passa sopra i vertici iniziali e finali, per ogni coppia FindPathsarà presente un elenco di percorsi tra di loro. Se non ci sono percorsi tra loro, sarà un elenco vuoto, quindi Length@ritorna 0. Se non ci sono affatto percorsi, allora msarà zero e noi ritorneremo True, altrimenti ritorneremo False.