-23 byte terima kasih kepada @Doorknob.
+42 byte yang menghitung mundur.
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]
Cobalah online!
Saya menulis ulang sebagian besar dari ini untuk menjelaskan kemunduran, saya pikir mungkin ada cara yang lebih mudah untuk mendefinisikan grafik g
, Mathematica memiliki GraphData[{"bishop",{8,8}}]
grafik semua gerakan yang dapat dilakukan oleh seorang uskup di papan catur ( Grafik Uskup ), tetapi grafik ini mencakup koneksi lebih lanjut dari tetangga diagonal terdekat. Jika ada yang tahu cara yang lebih singkat untuk melakukannya, beri tahu saya. Penghargaan untuk konstruksi grafik diberikan untuk jawaban MathematicaSE ini .
Pengembalian True
untuk kata sandi yang kuat, False
untuk kata sandi yang lemah / buruk. Perhatikan bahwa untuk sebagian besar kata sandi yang tidak dibentuk dengan benar, ia akan menghasilkan banyak pesan kesalahan dan kemudian kembali False
. Jika ini tidak sesuai dengan aturan maka mereka dapat ditekan dengan mengubah f[n_]:=...
ke f[n_]:=Quiet@...
biaya 6 byte.
Tidak Disatukan:
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]
Kerusakan:
p[m_]:=StringPartition[#,m]&
Membawa argumen string dan membaginya menjadi daftar string yang masing-masing panjangnya m
.
Check[...,False]
Mengembalikan False
jika ada pesan kesalahan yang dihasilkan, yang merupakan cara kita menangkap string yang terbentuk buruk (yaitu menganggap mereka terbentuk dengan baik, pasti menghasilkan kesalahan di telepon).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Mengambil string posisi gadai dan membaginya sedemikian rupa sehingga "a2h5b"
menjadi {{"a","2"},{"h","5"},{"b"}}
, kemudian LetterNumber
akan mengubah huruf menjadi angka ( a -> 1
, dll) dan FromDigits
mengubah angka menjadi bilangan bulat. Jika string tidak terbentuk dengan baik, langkah ini akan menghasilkan kesalahan yang akan ditangkap oleh Check
, kembali False
. Kedua angka ini kemudian dikonversi menjadi bilangan bulat yang sesuai dengan kotak di papan tulis.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Buat grafik semua tepi diagonal tetangga terdekat dengan posisi pion dihapus.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Ini adalah daftar simpul awal dan akhir yang tidak dihuni masing-masing
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Loop atas simpul awal dan akhir, untuk setiap pasangan FindPath
akan menjadi daftar jalur di antara mereka. Jika tidak ada jalur di antara mereka, itu akan menjadi daftar kosong, jadi Length@
kembali 0
. Jika tidak ada jalan sama sekali, maka m
akan menjadi nol, dan kami kembaliTrue
, jika tidak kembali False
.