-23 bajty dzięki @Doorknob.
+42 bajty odpowiadające za cofanie.
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]
Wypróbuj online!
Przepisałem większość tego, aby uwzględnić powrót do przeszłości, myślę, że może być łatwiejszy sposób zdefiniowania wykresu g, Mathematica ma wykres , GraphData[{"bishop",{8,8}}]który jest wykresem wszystkich ruchów, które biskup może wykonać na szachownicy ( Bishop Graph ), ale ten wykres zawiera dalsze połączenia niż najbliższy diagonalny sąsiad. Jeśli ktoś zna krótszy sposób, aby to zrobić, daj mi znać. Podziękowania dla budowy wykresu należą do tej odpowiedzi MathematicaSE .
Zwraca Truedla silnych haseł, Falsedla słabych / źle sformułowanych haseł. Pamiętaj, że w przypadku większości źle sformułowanych haseł wygeneruje wiele komunikatów o błędach, a następnie wróci False. Jeśli nie jest to zgodne z zasadami następnie mogą być tłumione przez zmianę f[n_]:=...do f[n_]:=Quiet@...kosztują 6 bajtów.
Nie golfowany:
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]
Awaria:
p[m_]:=StringPartition[#,m]&
Pobiera argument ciągu i dzieli go na listę ciągów o długości m.
Check[...,False]
Zwraca, Falsejeśli zostaną wygenerowane jakiekolwiek komunikaty o błędach, w ten sposób wychwytujemy źle sformułowane ciągi (tzn. Zakładamy, że są one dobrze sformułowane, co nieuchronnie powoduje błąd wzdłuż linii).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Pobiera ciąg pozycji pionu i dzieli go w taki sposób, że "a2h5b"staje się {{"a","2"},{"h","5"},{"b"}}, a następnie LetterNumberprzekształca literę na liczbę ( a -> 1itp.) I FromDigitskonwertuje cyfrę na liczbę całkowitą. Jeśli łańcuch nie jest dobrze uformowany, ten krok spowoduje błąd, który zostanie przechwycony przez Checkpowrót False. Te dwie liczby są następnie konwertowane na liczbę całkowitą odpowiadającą kwadratowi na planszy.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Tworzy wykres wszystkich ukośnych krawędzi najbliższego sąsiada z usuniętymi pozycjami pionka.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Są to odpowiednio listy niezajętych początkowych i końcowych wierzchołków
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Pętle nad początkowymi i końcowymi wierzchołkami, dla każdej pary FindPathbędzie lista ścieżek między nimi. Jeśli nie ma między nimi ścieżek, będzie to pusta lista, więc Length@zwraca 0. Jeśli w ogóle nie ma ścieżek, mwyniesie zero, a my wrócimy True, w przeciwnym razie wrócimy False.