गणितज्ञ, 326 325 बाइट्स
एक बाइट बचत को इंगित करने के लिए masterX224 के लिए धन्यवाद!
f[g_,w_,x_]:=(c={{1,1},{-1,1}};s=c.c/2;e=#<->#2&@@@#&;j=Join;h=FindShortestPath;t=#~Tuples~2&;a@d_:=e@Select[t@g,#-#2&@@#==d&];y@k=j@@(a/@j[s,c]);y@n=j@@(a/@{{1,2},{2,1},{-2,1},{-1,2}});v=Flatten[e@t@#&/@ConnectedComponents@a@#&/@#]&;y@r=v@s;y@b=v@c;Pick[p={b,k,n,r},z=Length[h[y@#,w,x]/.h@__->0]&/@p,Min[z~Complement~{0}]]);
एक समारोह को परिभाषित करता है f
तीन तर्कों लेने: g
बोर्ड का प्रतिनिधित्व पूर्णांकों का आदेश दिया जोड़े की एक सूची है, और w
और x
आरंभ और अंत वर्गों का प्रतिनिधित्व जोड़े का आदेश दिया। आउटपुट {b, k, n, r}
क्रमशः (बिशप, किंग, नाइट और रॉक का प्रतिनिधित्व) का सबसेट है , जिसमें दो वर्गों के बीच न्यूनतम चाल है। उदाहरण के लिए, तीसरे परीक्षण के मामले को f[{{0, 0}, {1, 1}, {1, 2}, {0, 3}}, {0, 0}, {0, 3}]
रिटर्न और रिटर्न द्वारा लागू किया जाता है {k}
; पिछले दो टेस्ट केस वापसी {k, n}
और {}
क्रमश:।
रणनीति बोर्ड के वर्गों को एक ग्राफ के कोने में अनुवाद करना है, जहां किनारों को प्रत्येक टुकड़े की चाल से निर्धारित किया जाता है, और फिर अंतर्निहित ग्राफ़ दिनचर्या का उपयोग करते हैं।
कोड का अधिक उपयोगकर्ता के अनुकूल संस्करण:
1 f[g_, w_, x_] := ( c = {{1, 1}, {-1, 1}}; s = c.c/2;
2 e = # <-> #2 & @@@ # &; j = Join; h = FindShortestPath; t = #~Tuples~2 &;
3 a@d_ := e@Select[t@g, # - #2 & @@ # == d &];
4 y@k = j @@ (a /@ j[s, c]);
5 y@n = j @@ (a /@ {{1, 2}, {2, 1}, {-2, 1}, {-1, 2}});
6 v = Flatten[e@t@# & /@
7 ConnectedComponents@a@# & /@ #] &;
8 y@r = v@s; y@b = v@c;
9 Pick[p = {b, k, n, r},
10 z = Length[h[y@#, w, x] /. h@__ -> 0] & /@ p,
11 Min[z~Complement~{0}]]
12 );
पंक्ति 3 में, Select[g~Tuples~2, # - #2 & @@ # == d
उन सभी लंबित जोड़ियों का पता लगाता है जिनका अंतर वेक्टर है d
; e
फिर इस तरह के प्रत्येक जोड़े को एक अप्रत्यक्ष ग्राफ़ एज में बदल देता है। तो a
एक ऐसा फंक्शन है जो सभी वर्टिकल के बीच किनारों को बनाता है जो एक निश्चित वेक्टर द्वारा भिन्न होता है।
यही कारण है, परिभाषित करने के लिए काफी है लाइनों 4 और 5, राजा के ग्राफ में y@k
(जो वैक्टर द्वारा उत्पन्न किनारों के मिलन लेता है {1, 1}
, {-1, 1}
, {0, 1}
, और {-1, 0}
) और सामंती ग्राफ y@n
(जो के साथ एक ही करता है {1, 2}
, {2, 1}
, {-2, 1}
, और {-1, 2}
)।
पंक्ति 7 में, ConnectedComponents@a@#
इन पड़ोसी रेखांकन में से एक लेता है और फिर इसके जुड़े घटकों को ढूंढता है; यह दी गई दिशा में कोने के सभी लाइन खंडों को समूहीकृत करने से मेल खाती है (ताकि एक बदमाश या बिशप को उनके द्वारा एक-एक करके आगे बढ़ना न पड़े)। फिर e@t@#
लाइन 6 पर एक ही जुड़े घटक में कोने के प्रत्येक जोड़े के बीच किनारों को रखा जाता है, जो तब Flatten
एकल ग्राफ में एड होते हैं । इस प्रकार 8 के माध्यम से 6 पंक्तियाँ बदमाश के ग्राफ y@r
और बिशप के ग्राफ को परिभाषित करती हैं y@b
।
अंत में, 11 के माध्यम से 9 की रेखाएं {b, k, n, r}
उस लक्ष्य के तत्वों को चुनती हैं जो दो लक्ष्य कोणों के बीच सबसे छोटा रास्ता बनाते हैं। FindShortestPath
यदि कोई त्रुटि त्रुटि ग्राफ में दिखाई नहीं देती है (जो कि कोई किनारा इससे निकलती है तो नहीं होगी), तो हम एक त्रुटि को फेंक देंगे और वापस लौटा देंगे, इसलिए हम इसके बजाय उन मामलों में h@__ -> 0
लौटने का उपयोग करते हैं 0
। और वैध कोने के बीच के रास्ते की कमी से लंबाई की एक सूची वापस आ जाती है 0
, इसलिए Min[z~Complement~{0}]
सबसे छोटे पथ की लंबाई की गणना करता है जो वास्तव में मौजूद है, ऊपर के बुरे मामलों की अनदेखी करता है।