प्यादा शतरंज की बिसात पर कब्जा


17

आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो इनपुट और आउटपुट के रूप में केवल पंजे के साथ एक शतरंजबोर्ड का प्रतिनिधित्व करने वाला एक स्ट्रिंग प्राप्त करता है या बोर्ड पर कोई भी कब्जा संभव है या रिटर्न देता है।

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

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

उदाहरण के लिए

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

बोर्ड का वर्णन करता है

--------

pppppppp


    P   

PPPP PPP

--------

एक सफेद मोहरा एक काले को पकड़ सकता है यदि काला एक तिरछे से ऊपर की ओर स्थित होता है (काला ऊपर-बाएं या ऊपर-दाएं) और एक काला मोहरा एक सफेद को पकड़ सकता है यदि सफेद उससे तिरछे नीचे है (सफेद है) डाउन-लेफ्ट या डाउन-राइट)। किसी अन्य कैप्चर मूव ( एन पासेंट ) पर विचार नहीं किया जाना चाहिए।

इनपुट

  • वर्णों से मिलकर एक FEN- जैसा तार 12345678pP/
  • इनपुट एक वैध शतरंज खेल की स्थिति का वर्णन करता है। इसका मतलब है (अन्य अधिक जटिल बाधाओं के बीच) प्रत्येक पक्ष के लिए अधिकतम 8 प्यादे होंगे और रैंक 1 और 8 पर कोई प्यादे नहीं होंगे।

उत्पादन

  • यदि दोनों ओर संभावित कब्जा है, तो आपको एक सत्य मूल्य और एक मिथ्या मूल्य का उत्पादन करना चाहिए ।

उदाहरण

ट्रू आउटपुट के साथ इनपुट (प्रति पंक्ति एक)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

मिथ्या आउटपुट के साथ इनपुट (प्रति पंक्ति एक)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

यह कोड गोल्फ है इसलिए सबसे छोटी प्रविष्टि जीतती है।


क्या उदाहरण बोर्ड द्वारा वर्णित नहीं किया जाना चाहिए 8/pppppppp/8/8/8/7P/PPPP1PPP/8?
TheNumberOne

@ NumberOne नहीं, 7Pइसका मतलब यह होगा कि प्यादा अंतिम, 8 वीं फाइल पर है। (चित्र हालांकि गलत था, मैंने इसे ठीक किया।)
यादृच्छिक

1
मुझे लगता है कि एन पास को हटाने से यह एक कम दिलचस्प पहेली बन जाती है।
corsiKa

जवाबों:


6

पायथ, 25 बाइट्स

/smC,>JsXz`M9*LN9dJ,8T"Pp

परीक्षण सूट

कदम:

उद्धरण चिह्नों ( N) के समतुल्य अंकों के साथ अंकों को प्रतिस्थापित करके इनपुट को परिवर्तित करें । इसमें बचाया जाता है J। हम फिर पहले 8 या 10 अक्षरों को काटते हैं, और परिणाम को मूल के साथ ज़िप करते हैं। कोई भी कैप्चरिंग जोड़ी में तब्दील हो जाएगी "Pp", इसलिए हम परिणामी सूची में उस स्ट्रिंग की गिनती पाते हैं। यह आउटपुट है।

एक बोनस के रूप में, यह वास्तव में इनपुट में संभव कैप्चर की संख्या को गिनता है।


एक और 25 समाधान: :sXz`M9*LN9"p.{7}(..)?P"1दुख की बात है कि अंतिम पैरामीटर :वैकल्पिक नहीं है (मुझे लगता है कि यह होना चाहिए)।
जकुबे

3
@ जकुब करेंगे।
इसहाक

12

रेटिना , 33 29 बाइट्स

T`d`w
)`\d
$0.
_

p.{7}(..)?P

किसी एकल फ़ाइल से कोड को चलाने के लिए, -sध्वज का उपयोग करें ।

पर्ल जैसी किसी चीज से आसानी से हरा जा सकता है, जहां अंकों के विस्तार में रिक्त स्थान (या अन्य वर्ण) 17 बाइट्स नहीं लेते हैं।

आउटपुट पॉजिटिव (सत्य) है यदि संभव कैप्चर और जीरो (मिथ्या) है तो नहीं।

व्याख्या

T`d`w
)`\d
$0.

यह दो चरणों का एक लूप है। पहला एक लिप्यंतरण चरण है जो प्रत्येक अंक को घटाता है, और शून्य को अंडरस्कोर करता है। क्यों? क्योंकि dऔर wनिम्नलिखित दो लाइनों का विस्तार:

0123456789
_0123456789AB...YZab...yz

यदि लिप्यंतरण चरण का लक्ष्य स्रोत सेट से अधिक लंबा है, तो बाहरी वर्णों को अनदेखा कर दिया जाता है, इसलिए डिक्रिमेंटिंग व्यवहार (ईमानदारी से, यह सौभाग्य था कि मैंने wवर्ण वर्ग का विस्तार करते समय अंक के सामने अंडरस्कोर लगाने का फैसला किया ) ।

फिर दूसरा चरण एक प्रतिस्थापन है, जो .प्रत्येक अंक को जोड़ता है । इसका मतलब है कि प्रत्येक अंक के लिए n, nउस अंक को अंडरस्कोर में बदलने से पहले अवधि जोड़ी जाती है।

_
<empty>

यह सिर्फ अंडरस्कोर से छुटकारा दिलाता है।

p.{7}(..)?P

अंत में, हम मैच ढूंढते हैं। चूँकि हम en passant को अनदेखा कर रहे हैं, कैप्चर केवल तभी संभव है जब वहाँ एक pऔर फिर उसके Pनीचे एक तिरछा हो। रैखिक स्ट्रिंग में, इसका सीधा सा मतलब है कि दो पंजे के बीच 7 या 9 अक्षर होने चाहिए। यह .{7}(..)?(यानी मैच 7 अक्षर और फिर, वैकल्पिक रूप से, एक और दो मैच) के साथ मेल खाता था।

इस तरह के मैच का चरण उसे मिलने वाले मैचों की संख्या देता है।


"पर्ल जैसी किसी चीज से आसानी से हरा जा सकता है, जहां अंकों के विस्तार में रिक्त स्थान (या अन्य वर्ण) 17 बाइट्स नहीं लेता है।": मैं पर्ल को आपके स्कोर को टाई करने के लिए भी नहीं मिल सकता, इसे अकेले हरा दें। । ( मेरा पर्ल जवाब। ) लेकिन शायद कोई और कर सकता है ....
msh210

3

जावास्क्रिप्ट, 272 वर्ण

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

शायद सुधार के लिए बहुत जगह है।


3

रूबी, 145 123 46 बाइट्स

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

मुझे नहीं पता कि मैंने इस बारे में पहले क्यों नहीं सोचा। यह बहुत छोटा है और बहुत पठनीय है।

यहाँ परीक्षण है: http://ideone.com/Gzav8N


पुराना तरीका:

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

ऑनलाइन टेस्ट: http://ideone.com/9L01lf , गोल्फिंग से पहले का संस्करण: http://ideone.com/CSmqlW

संशोधनों का इतिहास यहां उपलब्ध है


2

ईएस 6, 64 बाइट्स

एक उपयुक्त बाइट गिनती, अगर यह रहता है!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

मैं वास्तव में दूसरे जवाबों को पहले पढ़े बिना इस समाधान के बारे में सोचता था, लेकिन अगर आप मुझ पर विश्वास नहीं करते तो मुझे कोई आपत्ति नहीं होगी।



0

PHP, 94 87 80 बाइट्स

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

यही कारण है कि पाश + strtrकी तुलना में बहुत कम है preg_replace_callbackके साथ str_pad


0

जेली, 88 84 79 72 69 65 64 63 60 बाइट्स

निश्चित तौर पर सुधार की गुंजाइश है। नॉनकंपेटिंग क्योंकि सवाल से पहले जेली बनाई गई थी। मुझे बताने के लिए @lirtosiast का शुक्रिया!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.