-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 True
dla silnych haseł, False
dla 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, False
jeś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 LetterNumber
przekształca literę na liczbę ( a -> 1
itp.) I FromDigits
konwertuje cyfrę na liczbę całkowitą. Jeśli łańcuch nie jest dobrze uformowany, ten krok spowoduje błąd, który zostanie przechwycony przez Check
powró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 FindPath
bę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, m
wyniesie zero, a my wrócimy True
, w przeciwnym razie wrócimy False
.