-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 True
per password complesse, False
per 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 False
se 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 LetterNumber
converte la lettera in un numero ( a -> 1
, ecc.) E FromDigits
converte il numero in un numero intero. Se la stringa non è ben formata, questo passaggio produrrà un errore che verrà intercettato Check
e 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 FindPath
sarà 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 m
sarà zero e noi ritorneremo True
, altrimenti ritorneremo False
.