-23 Bytes dank @Doorknob.
+42 Bytes für die Rückverfolgung.
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]
Probieren Sie es online!
Ich habe das meiste davon umgeschrieben, um das Zurückverfolgen zu berücksichtigen. Ich glaube, es gibt eine einfachere Möglichkeit, das Diagramm zu definieren g
. Mathematica gibt GraphData[{"bishop",{8,8}}]
das Diagramm aller Züge an, die ein Bischof auf einem Schachbrett ausführen kann ( Bischofs-Diagramm ). Dieses Diagramm enthält jedoch weitere Verbindungen als nächster diagonaler Nachbar. Wenn jemand einen kürzeren Weg kennt, lass es mich wissen. Diese MathematicaSE-Antwort ist für die Erstellung des Graphen verantwortlich .
Gibt True
für starke Passwörter und False
für schwache / falsch geformte Passwörter zurück. Beachten Sie, dass bei den meisten falsch formulierten Passwörtern eine Reihe von Fehlermeldungen ausgegeben werden und diese dann zurückgegeben werden False
. Wenn dies nicht den Regeln entspricht, können sie durch Umstellung f[n_]:=...
auf f[n_]:=Quiet@...
6 Byte unterdrückt werden .
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]
Nervenzusammenbruch:
p[m_]:=StringPartition[#,m]&
Nimmt ein Zeichenfolgenargument und teilt es in eine Liste von Zeichenfolgen mit jeweils einer Länge auf m
.
Check[...,False]
Gibt zurück, False
wenn Fehlermeldungen erzeugt werden. Auf diese Weise werden die falsch geformten Zeichenfolgen abgefangen (dh es wird angenommen, dass sie gut geformt sind und zwangsläufig einen Fehler auf der ganzen Linie verursachen).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Nimmt die Folge von Bauernpositionen und teilt sie so, dass sie "a2h5b"
wird {{"a","2"},{"h","5"},{"b"}}
, LetterNumber
konvertiert dann den Buchstaben in eine Zahl ( a -> 1
usw.) und FromDigits
konvertiert die Zahl in eine Ganzzahl. Wenn die Zeichenkette nicht richtig geformt ist, erzeugt dieser Schritt einen Fehler, der bei der Check
Rückkehr abgefangen wird False
. Diese beiden Zahlen werden dann in eine Ganzzahl umgewandelt, die einem Quadrat auf der Tafel entspricht.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Konstruiert das Diagramm aller diagonalen Kanten des nächsten Nachbarn, wobei die Bauernpositionen gelöscht werden.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Hierbei handelt es sich um Listen nicht belegter Start- und Endpunkte
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Durchlaufen Sie die Start- und Endpunkte. Für jedes Paar FindPath
wird eine Liste von Pfaden zwischen ihnen erstellt. Wenn es keine Pfade zwischen ihnen sind, wird es eine leere Liste, so sein Length@
Rendite 0
. Wenn es überhaupt keine Pfade gibt, m
wird Null sein, und wir kehren zurück True
, andernfalls kehren wir zurück False
.