-23 ไบต์ขอบคุณ @Doorknob
+42 ไบต์คิดเป็น backtracking
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]
ลองออนไลน์!
ฉันเขียนส่วนใหญ่นี้เพื่อบัญชี backtracking ฉันคิดว่าอาจมีวิธีที่ง่ายกว่าในการกำหนดกราฟg
Mathematica มีGraphData[{"bishop",{8,8}}]
ซึ่งเป็นกราฟของการเคลื่อนไหวทั้งหมดที่อธิการสามารถทำบนกระดานหมากรุก ( Bishop Graph ) แต่กราฟนี้รวมการเชื่อมต่อเพิ่มเติม กว่าเพื่อนบ้านแนวทแยงที่ใกล้ที่สุด หากใครรู้วิธีที่สั้นกว่าในการทำเช่นนั้นแจ้งให้ฉันทราบ เครดิตสำหรับการสร้างกราฟไปที่คำตอบ MathematicaSEนี้
ส่งคืนTrue
สำหรับรหัสผ่านที่คาดเดายากสำหรับรหัสผ่านที่False
อ่อนแอ / มีรูปแบบไม่ดี False
โปรดทราบว่าส่วนใหญ่ของรหัสผ่านที่ไม่ดีที่เกิดขึ้นจะผลิตพวงของข้อความผิดพลาดแล้วกลับ ถ้าสิ่งนี้ไม่สอดคล้องกับกฎพวกเขาสามารถถูกระงับได้โดยเปลี่ยนf[n_]:=...
เป็นการf[n_]:=Quiet@...
คิดต้นทุน 6 ไบต์
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]
ชำรุด:
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