@Doorknobのおかげで-23バイト。
バックトラッキングを考慮した+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}}]
司教は、チェス盤(上作ることができるすべての動きのグラフであるビショップグラフ)が、このグラフは、さらに接続を含みます最も近い斜めの隣人より。誰かがそれを行うより短い方法を知っているなら、私に知らせてください。グラフ構築の功績は、このMathematicaSEの回答にあります。
True
強力なパスワード、False
脆弱なパスワード、不正なパスワードを返します。不正な形式のパスワードのほとんどについては、大量のエラーメッセージが生成されてから返されることに注意してくださいFalse
。これがルールに沿っていない場合、6バイトのコストに変更f[n_]:=...
することでそれらを抑制することができf[n_]:=Quiet@...
ます。
ゴルフをしていない:
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
。これらの2つの数値は、ボード上の正方形に対応する整数に変換されます。
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
0になりTrue
、そうでない場合はreturnになりFalse
ます。