गणितज्ञ, 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}]सबसे छोटे पथ की लंबाई की गणना करता है जो वास्तव में मौजूद है, ऊपर के बुरे मामलों की अनदेखी करता है।