-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 байт.
Безголівки:
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
.