शतरंज एंडगेम: व्हाइट टू मेट इन वन वन


19

शतरंज के खेल की वर्तमान स्थिति का प्रतिनिधित्व करने वाले पत्रों की 8x8 ग्रिड को देखते हुए, आपके कार्यक्रम का कार्य सफेद के लिए एक अगली चाल खोजना है, जिसके परिणामस्वरूप चेकमेट (उत्तर हमेशा एक चाल में दोस्त होगा)।

इनपुट

इनपुट STDIN - 8 वर्णों की 8 पंक्तियों पर होगा। प्रत्येक वर्ण के अर्थ इस प्रकार हैं:

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

ऊपरी मामले पत्र सफेद टुकड़ों का प्रतिनिधित्व करते हैं, और निचला मामला काले रंग का प्रतिनिधित्व करता है। बोर्ड को उन्मुख किया जाएगा ताकि सफेद नीचे से खेल रहा हो और काले ऊपर से नीचे खेल रहा हो।

उत्पादन

सफेद रंग के लिए एक चाल जिसके परिणामस्वरूप बीजगणित संकेतन में चेकमेट होता है । जब एक टुकड़ा लिया गया हो, तो आपको नोट करने की आवश्यकता नहीं है, और न ही आपको दो समान टुकड़ों के बीच असंतोष करने के बारे में चिंतित होने की आवश्यकता है जो एक ही चाल बना सकते हैं।

नमूना इनपुट

उदाहरण 1

इनपुट:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

आउटपुट:

c6

उदाहरण 2

इनपुट:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

आउटपुट:

Nf5

उदाहरण 3

इनपुट:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

आउटपुट:

Rh5

आप मान सकते हैं कि समाधान में कास्टिंग या एन-पासेंट शामिल नहीं होगा।

यह कोड-गोल्फ है - सबसे छोटा समाधान जीतता है।

( Mateinone.com से लिए गए उदाहरण - पहेली 81, 82 और 83)


नहीं। मुझे लगता है कि इस प्रश्न के प्रयोजनों के लिए आप यह मान सकते हैं कि उत्तर में कास्टिंग या एन-पासेंट शामिल नहीं होगा। मैं सवाल को अपडेट करूंगा।
गारेथ

हमें एक से अधिक मेट-इन-वन वाले पदों को कैसे संभालना चाहिए?
रोब

@ रब केवल एक समाधान की आवश्यकता है, इसलिए जो भी समाधान आपको पहले मिले, उसे आउटपुट करें।
गारेथ

क्या यह मान लेना भी सुरक्षित है कि समाधान में पदोन्नति शामिल नहीं है?
पीटर टेलर

@Peter हाँ, मैं इस समस्या को अधिक जटिल नहीं करना चाहता।
गारेथ

जवाबों:


7

रूबी, 589 512 510 499 493 वर्ण

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

इनपुट स्टड के माध्यम से दिया जाता है, जैसे:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

आउटपुट केवल एक चाल नहीं है जो एक साथी को एक में मजबूर करता है, बल्कि हर चाल ऐसा करता है।

संपादन 1: फ़ंक्शन eका उपयोग केवल एक बार किया गया था, इसलिए मैंने इसे झुकाया। दूसरा, एन्कोडिंग अब 10. के बजाय 5 नंबर पर आधारित है और बोर्ड के क्लोनिंग को रीक्रिएट करने से काफी कुछ चार्ज बचता है।

संपादन 2: फिर भी उतना सुधार नहीं हुआ जितना मैं चाहता था। से हैश बदलने {a=>b,c=>d}के लिए Hash[a,b,c,d]। यह 4 वर्णों पर खर्च होता है, लेकिन प्रति कुंजी-युग्म प्रति एक बचाता है।

संपादित करें 3: केवल मामूली कटौती: एम (4 वर्ण), t==?--> t<?.(2) को सम्मिलित करते हुए, अंत (2) में बीजीय संकेतन में प्यादा को हटाकर, प्रतिस्थापित पुट (3) को हटा दिया जाता है। कार्यक्रम अब 500 अक्षरों से कम है।

संपादित करें 4: यह दिलचस्प है कि इस तरह के एक कार्यक्रम में अभी भी कितना मिल सकता है। लूप के बाहर एक अपरिवर्तनीय स्थानांतरित किया और एक और डुप्लिकेट गणना पाया।


"एक नहीं, लेकिन किसी भी" से आपका मतलब है "जरूरी नहीं कि एक, लेकिन हर"?
मैथ्यू पढ़ें

@ मैथ्यू आप सही कह रहे हैं। मेरा मतलब था "हर"।
हावर्ड

आप उपयोग कर सकते हैं [*$<]के बजाय $<.map{|l|l}
लॉजैकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.