-23 байта благодаря @ Doorknob.
+42 байта с учетом возврата.
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]
Попробуйте онлайн!
Я переписал большую часть этого, чтобы учесть обратную реакцию, я думаю, что может быть более простой способ определить график g
, у Mathematica есть GraphData[{"bishop",{8,8}}]
график всех ходов, которые епископ может сделать на шахматной доске ( Bishop Graph ), но этот график включает в себя дальнейшие связи чем ближайший диагональный сосед. Если кто-нибудь знает более короткий способ сделать это, дайте мне знать. Кредит на построение графика идет на этот ответ MathematicaSE .
Возвращает True
для надежных паролей, False
для слабых / плохо сформированных паролей. Обратите внимание, что для большинства плохо сформированных паролей он выдаст кучу сообщений об ошибках, а затем вернет False
. Если это не соответствует правилам, то их можно подавить, изменив стоимость f[n_]:=...
до f[n_]:=Quiet@...
6 байтов.
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]
Сломать:
p[m_]:=StringPartition[#,m]&
Принимает строковый аргумент и разбивает его на список строк, каждая из которых имеет длину m
.
Check[...,False]
Возвращает, False
если генерируются какие-либо сообщения об ошибках, то есть, как мы ловим неправильно сформированные строки (т.е. предполагаем, что они правильно сформированы, что неизбежно приводит к ошибке в дальнейшем).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Занимает последовательность позиций пешки и разделяет ее так, что "a2h5b"
становится {{"a","2"},{"h","5"},{"b"}}
, затем LetterNumber
преобразует букву в число ( a -> 1
и т. Д.) И FromDigits
преобразует цифру в целое число. Если строка не правильно сформирована, этот шаг приведет к ошибке, которая будет Check
возвращена False
. Эти два числа затем преобразуются в целое число, соответствующее квадрату на доске.
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]
Зацикливается на начальной и конечной вершинах, для каждой пары FindPath
будет список путей между ними. Если между ними нет путей, это будет пустой список, поэтому Length@
возвращается 0
. Если путей вообще нет, то m
будет ноль, и мы вернемся True
, в противном случае вернемся False
.