@Doorknob sayesinde -23 bayt.
Geri izleme için +42 bayt muhasebe.
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]
Çevrimiçi deneyin!
Geri izlemeyi açıklamak için bunların çoğunu yeniden yazdım, grafiği tanımlamanın daha kolay bir yolu olabileceğini düşünüyorum g
, Mathematica, GraphData[{"bishop",{8,8}}]
bir piskoposun satranç tahtasında yapabileceği tüm hareketlerin grafiği ( Bishop Grafiği ), ancak bu grafik daha fazla bağlantı içeriyor en yakın diyagonal komşuya göre. Eğer bunu yapmanın daha kısa bir yolunu bilen biri varsa bana bildirin. Grafik oluşturma kredisi bu MathematicaSE cevabına gider .
Zayıf / kötü biçimlendirilmiş parolalar True
için güçlü parolaları döndürür False
. Hatalı oluşturulmuş şifrelerin çoğu için bir grup hata mesajı üreteceğini ve sonra geri döneceğini unutmayın False
. Bu kurallar doğrultusunda değilse o zaman değiştirerek bastırılabilir f[n_]:=...
için f[n_]:=Quiet@...
6 bayt malolan.
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]
Yıkmak:
p[m_]:=StringPartition[#,m]&
Bir dize argümanı alır ve her biri uzunluktaki bir dize listesine böler m
.
Check[...,False]
False
Herhangi bir hata mesajı üretilirse, yani hatalı biçimlendirilmiş dizeleri nasıl yakaladığımızı döndürür (yani iyi biçimlendirildiklerini, kaçınılmaz olarak satırda bir hata oluşturduğunu varsayalım).
(8*#2 + #1 - 8) & @@@ ({LetterNumber@#, FromDigits@#2} & @@@ (p@1 /@
p[UpTo@2]@n));
Piyon pozisyonların dizeyi alır ve bu tür böler "a2h5b"
olur {{"a","2"},{"h","5"},{"b"}}
, daha sonra LetterNumber
bir dizi (mektup dönüştürür a -> 1
, vs) ve FromDigits
bir tamsayı içine dönüştürür rakamı. Dize de kurulmadığı takdirde, bu adım ile yakalanacak bir hata üretecektir Check
dönen, False
. Bu iki sayı daha sonra karttaki bir kareye karşılık gelen bir tam sayıya dönüştürülür.
r = GridGraph[{8, 8}];
g = Graph[
Sort /@ UndirectedEdge @@@
Position[Outer[EuclideanDistance@## &, #, #, 1],
N@Sqrt@2] &@GraphEmbedding@r // Union]~VertexDelete~w;
Piyon konumları silinmiş olarak en yakın komşu diyagonal kenarların grafiğini oluşturur.
s = Complement[{1,2,3,4,5,6,7,8},w];
e = Complement[{57,58,59,60,61,62,63,64},w];
Bunlar sırasıyla boş başlangıç ve bitiş köşelerinin listeleridir
m=0
Do[m += Length@FindPath[g, i, j], {i, s}, {j, e}];
If[m == 0,True,False]
Her çift için başlangıç ve bitiş köşeleri üzerindeki döngüler, FindPath
aralarındaki yolların bir listesi olacaktır. Aralarında hiçbir yol yoksa, boş bir liste olacaktır, bu yüzden Length@
geri döner 0
. Hiç yol yoksa, m
sıfır olur ve geri döneriz True
, aksi takdirde geri döneriz False
.