-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]&
接受一个字符串参数,并将其拆分为每个length的字符串列表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
。