शतरंज की बिसात


14

शतरंज के टुकड़े (राजा, रानी, ​​बदमाश, बिशप और शूरवीर) और प्यादे एक बोर्ड पर हैं, लेकिन a1 या h8 वर्ग पर नहीं। अपने काम के लिए खाली a1 से खाली h8 चौकों तक यात्रा करना है, केवल खाली वर्गों से गुजरना है। आंदोलन के नियम इस प्रकार हैं:

  1. आप किसी भी खाली वर्ग से आगे के किसी भी खाली वर्ग में जा सकते हैं (उसी रैंक, अगली या पूर्ववर्ती फ़ाइल; या उसी फ़ाइल, अगली या पूर्ववर्ती रैंक)।
  2. आप किसी भी खाली वर्ग से किसी भी खाली वर्ग के आगे तिरछे (अगली या पूर्ववर्ती रैंक, अगली या पूर्ववर्ती फ़ाइल) से आगे बढ़ सकते हैं, बशर्ते कि कैट्टी-कॉर्नर के चौराहों में या तो (ए) दो प्यादे या (ख) विपरीत के टुकड़े हों। रंग। (दो गैर-मोहरे टुकड़े, या एक गैर-मोहरे का टुकड़ा और एक मोहरा, एक ही रंग के कोने में आपकी प्रगति को बार करने के लिए पर्याप्त मजबूत होते हैं, लेकिन दो पंजे नहीं होते हैं, और विपरीत रंग के टुकड़े / मोहरे काम नहीं करते हैं; कॉन्सर्ट को अपने तरीके से बार करें।) उदाहरण के लिए, यदि आप c4 और d5 पर हैं, तो आप इसे प्रदान कर सकते हैं, बशर्ते कि c5 और d4 में मोहरे हों या विपरीत रंग के टुकड़े / पंजे हों। तस्वीरों के लिए नीचे, "उदाहरण विकर्ण" अनुभाग देखें।

इनपुट

FEN का बोर्ड विवरण। वह है: इनपुट एक स्ट्रिंग होगी जिसमें रैंक 8 , एक स्लैश ( /), रैंक 7 का विवरण , एक स्लैश, ... और रैंक 1 का विवरण शामिल है । प्रत्येक रैंक के विवरण में फाइल से फाइल एच तक चलने वाले नंबर और अक्षर होते हैं , जहां अक्षर टुकड़ों और प्यादों (काले वाले p= प्यादा, n= नाइट, b= बिशप, r= रोक, q= रानी, kराजा, और सफेद) को दर्शाते हैं। लोगों को उसी के पूंजीकृत संस्करण हैं) और संख्याएं खाली वर्गों की क्रमिक संख्या को दर्शाती हैं। उदाहरण के लिए, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNएक प्लाई मूव के बाद का बोर्ड है (राजा के प्यादा से e4 तक) एक शतरंज के खेल में।

ए 1 और एच 8 इनपुट में खाली होंगे; यानी, पहले स्लैश के पहले एक अंक होता है, और अंतिम स्लैश के बाद एक अंक होता है।

उत्पादन

सत्य या असत्य, यह दर्शाता है कि h8 के लिए सफल मार्ग संभव है।

यदि इनपुट एक मान्य FEN बोर्ड विवरण नहीं है (मतलब, एक जो मेरे स्पष्टीकरण से मेल खाता है), या यदि a1 या h8 पर कब्जा कर लिया गया है, तो आउटपुट कुछ भी हो सकता है या कुछ भी नहीं। (दूसरे शब्दों में: आप मान सकते हैं कि इनपुट ऊपर की आवश्यकताओं को पूरा करता है।)

स्कोरिंग

यह कोड गोल्फ है: सबसे कम बाइट्स जीतती हैं।

उदाहरण इनपुट और आउटपुट

ध्यान दें कि आपका कोड सभी मान्य इनपुट के लिए काम करना चाहिए, न कि केवल उदाहरण के लिए।

एक स्थान और wप्रत्येक FEN के बाद इसे कल्पना करने के लिए जोड़ें http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html। (ध्यान दें कि कुछ अन्य ऑनलाइन FEN विज़ुअलाइज़र एक बोर्ड को शतरंज में अवैध नहीं होने देंगे, जैसे कि रैंक 1 या 8 पर एक मोहरे के साथ , इसलिए हमारे उद्देश्यों के लिए इसका उपयोग नहीं किया जा सकता है।)

सत्य उदाहरण

  • 8/8/8/8/8/8/8/8 - खाली बोर्ड
  • 1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2- वहाँ एक रास्ता है a1 , बी 2 , बी 3 , बी 4 , B5 , B6 , B7 , सी 8 , d7 , ( नहीं e8 , कि बंद अवरुद्ध है, लेकिन) d6 , d5 , d4 , डी 3 , d2 , d1 , ई 1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 - एक उदाहरण जहां एक वर्ग जिसे एक बिंदु पर अवरुद्ध किया जाता है, उसे बाद में पास करना होगा (यह सुनिश्चित करने के लिए कि आप वर्गों को अगम्य के रूप में सेट नहीं करते हैं)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k- वहाँ के माध्यम से एक ही रास्ता है (बस अपनी नाक का पालन करें: प्रत्येक चरण पर जाने के लिए केवल एक वर्ग है, जब तक कि एक कदम पीछे न लें); यह भी एक उदाहरण है जहां एक वर्ग एक बिंदु पर अवरुद्ध है लेकिन बाद में आवश्यक है

झूठे उदाहरण

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 - एक पथ पर किसी भी प्रयास को दो तिरछे स्थित समान-रंग के टुकड़ों से गुजरना होगा
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1rA8-h1 विकर्ण के माध्यम से एकमात्र तरीका f2-g3 है , लेकिन इसके लिए e1-d2 या f2-e3 के माध्यम से मार्ग की आवश्यकता होगी , जो दोनों असंभव हैं।
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

उदाहरण विकर्ण

यदि ऊपर गद्य अस्पष्ट था, तो यहाँ कुछ चित्र हैं।

निष्क्रिय विकर्ण

एक ही रंग के पंजे विपरीत रंगों के पंजे विपरीत रंगों के बदमाश

अव्यवस्थित विकर्ण

एक बदमाश और एक ही रंग का एक मोहरा एक ही रंग के बदमाश


मुझे खेद है, मैं stanadard गोल्फ नियमों के बारे में निश्चित नहीं हूं: यदि आप एक अवैध स्ट्रिंग डालते हैं, तो क्या होता है? कोई व्यवहार हो सकता है?
एलेक्स बर्न

@alexberne मेरा मानना ​​है कि यह इसे कवर करता है: "आपका कोड सभी मान्य इनपुट के लिए काम करना चाहिए "।
रेनबोल्ट

@alexberne, मैंने संपादित किया है। क्या यह अब स्पष्ट है?
msh210

हाँ धन्यवाद। मैं यहाँ नया हूँ, इसलिए यह गोल्फ खिलाड़ी के लिए usal सामान हो सकता है, लेकिन मेरे लिए यह स्पष्ट नहीं था :)
एलेक्स बर्न

बस एक महान पहेली @ msh210 के लिए धन्यवाद कहना चाहता था। मुझे समझ नहीं आता कि अधिक उत्तर क्यों नहीं हैं।
जोफान

जवाबों:


6

VBA 668 666 633 622 548 510 489 435 331 322 319 315 बाइट्स

Function Z(F):Dim X(7,7):While Q<64:R=R+1:V=Asc(Mid(F,R))-48:If V>9 Then X(Q\8,Q Mod 8)=(3+(V\8=V/8))*Sgn(48-V):V=1
Q=Q-V*(V>0):Wend:X(7,0)=1:For W=0 To 2E3:Q=W Mod 8:P=W\8 Mod 8:For T=Q+(Q>0) To Q-(Q<7):For S=P+(P>0) To P-(P<7):If X(S,T)=0 Then X(S,T)=(1=X(P,Q))*(6>X(P,T)*X(S,Q))
Next S,T,W:Z=X(0,7):End Function

इनपुट स्ट्रिंग को पढ़ना 'वेन्ड' तक व्याप्त है। अच्छा साइड इफेक्ट - यह एक बार बोर्ड [X] पूरी तरह से कोडित होने के बाद इनपुट स्ट्रिंग को बंद कर देता है, इसलिए आप अंत में एक विवरण छोड़ सकते हैं।

बोर्ड कोडिंग में, प्यादे 2 हैं, अन्य टुकड़े 3 हैं, काला नकारात्मक है। पावों को 'पी' और 'पी' द्वारा पहचाना जाता है जो वर्ण कोड 8 से विभाज्य हैं।

'एक्स (7,0) = 1', 1 सुलभ सेट करना , वह जगह है जहां से पथ जांच शुरू होती है। यह बार-बार सुलभ (1) के रूप में चिह्नित वर्गों से सुलभ वर्गों को जोड़ने की कोशिश कर रहे बोर्ड को स्कैन करता है। विकर्ण अभिगम और अधिभोग की जाँच एक IF + तर्क-कैल्क में की जाती है, जो कभी किसी फ़ंक्शन में रहता था, लेकिन अब नेस्टेड लूप में बैठता है। विकर्ण एक्सेस चेक दो किटी-कोने वाले वर्गों के उत्पाद पर निर्भर करता है, जो कि केवल 6 या उससे अधिक है यदि टुकड़े एक ही रंग के हैं और कम से कम एक टुकड़ा एक मोहरा नहीं है।

स्प्रेडशीट में कॉल करें; X (0,7) - 1 में मान लौटाता है यदि h8 सुलभ और 0 यदि नहीं - जिसे एक्सेल सत्य / असत्य के रूप में पहचानता है। = आईएफ (जेड (सी 2), "हां", "नहीं")

यहाँ छवि विवरण दर्ज करें

हो सकता है कि मैं नीचे दिए गए कोड को नीचे, ऊपर से छानने के साथ ले गया, इसलिए यहां एक अर्ध-असंगठित टिप्पणी संस्करण है:

Function MazeAssess(F)  'input string F (FEN)
Dim X(7, 7)             'size/clear the board; also, implicitly, Q = 0: R = 0
'Interpret string for 8 rows of chessboard
While Q < 64
    R = R + 1           ' next char
    V = Asc(Mid(F, R)) - 48  ' adjust so numerals are correct
    If V > 9 Then X(Q \ 8, Q Mod 8) = (3 + (V \ 8 = V / 8)) * Sgn(48 - V): V = 1 ' get piece type (2/3) and colour (+/-); set for single column step
    Q = Q - V * (V > 0) ' increment column (unless slash)
Wend
'Evaluate maze
X(7, 0) = 1             ' a1 is accessible
For W = 0 To 2000       ' 1920 = 30 passes x 8 rows x 8 columns, golfed to 2E3
    Q = W Mod 8         ' extracting column
    P = W \ 8 Mod 8     ' extracting row
    For T = Q + (Q > 0) To Q - (Q < 7)     ' loop on nearby columns Q-1 to Q+1 with edge awareness
        For S = P + (P > 0) To P - (P < 7) ' loop on nearby rows (as above)
            If X(S, T) = 0 Then X(S, T) = (1 = X(P, Q)) * (6 > X(P, T) * X(S, Q)) ' approve nearby empty squares if current square approved and access is possible
        Next 'S
    Next 'T
Next 'W
MazeAssess = X(0, 7)    ' report result for h8
End Function

प्रगति टिप्पणी

संपादन 1: कोड अब 666-शैतानी के रूप में नहीं है :-D और अपने कार्यों को खो दिया है; मुझे उन्हें ओवरहेड से बचने के लिए लिखने के लिए एक छोटा-सा तरीका मिला।

संपादित 2: एक और बड़ी छलांग आगे, प्रभावी रूप से inc / dec कार्यों को हटाने, आह, और ग्लोबल्स के एक जोड़े का उपयोग करने के काम को खत्म करना। मैं आखिरकार इस की फांसी हो सकती है ...।

टुकड़ों और वर्गों की कोडिंग बदल गई। कोड लंबाई पर कोई प्रभाव नहीं।

संपादित करें 3: (नकली) कार्यों की वापसी, उन सभी कष्टप्रद Callबाइट्स, और कुछ अन्य tweaks को हटाकर ।

संपादित करें 4: बड़े 500 के माध्यम से तोड़कर, woohoo - 1 में छोरों के लिए 3 smooshed।

संपादित करें 5: जिमी क्रिकेट, एक और बड़ी गिरावट जब मैंने दो कार्यों को एक साथ सुलझाया - मेरी विकर्ण पहुंच जांच हमेशा आसन्न वर्गों के लिए गुजरती है, इसलिए ...

संपादित करें 6: पवित्र भतीजे, एक और बड़े पैमाने पर गिरावट। बाहरी कार्यों और इस तरह ग्लोबल्स को बुह-बाय ... मैं आधे मूल पोस्ट की लंबाई के नीचे चला गया हूं ...।

संपादित करें 7: अन-गोफ़र्ड संस्करण जोड़ें

संपादित करें 8: कुछ डॉलर अधिक के लिए पढ़ने की प्रक्रिया को संशोधित किया

संपादित करें 9: रक्त की अंतिम कुछ बूंदों के लिए कुछ अभिव्यक्तियों को निचोड़ें

संपादित करें 10: कंपाउंड Nextस्टेटमेंट कुछ बाइट्स शेड करता है


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

3 सफल बोर्ड 3 अवरुद्ध बोर्डों

चुनौती बोर्डों की एक जोड़ी: h8 दोनों में सुलभ है:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1R1 / 1r1r1n2 - 10 पास को हल करने के लिए
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6 - एक घुमावदार पथ

1
बहुत अच्छा, और +1, लेकिन: (1) क्या आपको यकीन है कि 960 कदम पर्याप्त हैं? (२) क्या आप बोर्ड को उल्टा देख कर कुछ बाइट बचा सकते हैं? If V>9 Then X(7-P,C)=क्या मुझे लगता है (ऐसा नहीं है कि मुझे पता है कि VBA) बन जाएगा If V>9 Then X(P,C)=
msh210

दरअसल वह तकनीक P को इनिशियलाइज़ करने से बचाता है, इसलिए :-) पूछने के लिए धन्यवाद। और हां, मुझे यकीन है कि बोर्ड के 15 पास पर्याप्त हैं; मैंने काफी चेकिंग की। मैं वास्तव में इसे पिछले 10 पास को आगे बढ़ाने में सक्षम नहीं हुआ हूं, लेकिन 640 और 960 में समान वर्ण हैं, इसलिए मैं इसे सुरक्षित खेलूंगा। लेकिन अगर मैं बोर्ड को उल्टा काटता हूं, तो यह COULD 10 से अधिक पास लेता है, और शायद 15 से अधिक - जब तक कि मैं बोर्ड को उल्टा नहीं कर देता, जिसमें ओवरहेड होता।
जोफेन

@ msh210 1 अतिरिक्त अवलोकन - 15 लूप्स केवल पूरे बोर्ड का विश्लेषण करने के लिए पर्याप्त है, सबसे खराब स्थिति, लेकिन 10 लूप्स h8 का दर्जा पाने के लिए पर्याप्त है, इसलिए मेरे पास वास्तव में एक बड़ा मार्जिन है। कारण यह है कि रास्तों का पता लगाना मूल्यांकन की दिशा में बहुत तेजी से काम करता है, जिससे पंक्ति # और कॉलम # बढ़ रही है - जब तक पथ ऊपर या दाएं जा रहा है, यह एक ही पास में पूरा हो जाएगा। बाएं या नीचे जाने पर केवल एक कदम आगे प्रति पास मिलता है।
जोफेन

@ msh210 पढ़ी प्रक्रिया पर एक सुधार के भाग के रूप में - जो कि संकीर्ण रूप से FEN स्ट्रिंग के अंत में एक टिप्पणी छोड़ने की सुविधा रखता था - मैंने आपके द्वारा सुझाए गए बोर्ड को उलट दिया - कुछ बोर्ड अब 15 पास (17 तक) ले लेते हैं। फ़ंक्शन बोर्ड के 30 पास तक बढ़ गया है।
जोफेन

आप के सभी उदाहरणों संघनक द्वारा 3 बाइट्स ड्रॉप कर सकते हैं @Joffan [some non-letter character] Toलिए[some non-letter character]To
टेलर स्कॉट

3

मतलाब, 636 887 बाइट्स बचाए गए (इंडेंटेशन सहित)

यह समाधान बहुत गोल्फ नहीं है, लेकिन मैं इसे आगे बढ़ाना चाहता था।

function[n] = h(x)
o=[];
for i=x
 b={blanks(str2num(i)),'K','k',i};o=[o b{~cellfun(@isempty,regexp(i,{'\d','[NBRQK]','[nbrqk]','p|P'}))}];
end
o=fliplr(reshape(o,8,8))
for i=1:64
 b=i-[-8,8,7,-1,-9,1,9,-7];
 if mod(i,8)==1
  b=b(1:5);
 elseif mod(i,8)==0
  b=b([1,2,6:8]);
 end
 b=b(b<65&b>0);c=o(b);dn=b(isspace(c)&ismember(b,i-[9,7,-9,-7]));
 for j=dn
  g=o(b(ismember(b,j-[-8,8,7,-1,-9,1,9,-7])));
  if ~isempty(regexp(g,'pk|kp|PK|KP|kk|KK'));c(b==j)='X';end;
 end
 Bc{i}=b(c==32);
end
n=Bc{1};
on=[];
while length(n)>length(on)
 on=n;
 for i=1:length(n)
  n=unique([n Bc{n(i)}]);
 end
end
any(n==64)
end

xऊपर बताए अनुसार एक बोर्ड स्ट्रिंग को पढ़ता है और इसे पूरी तरह से प्रतिनिधित्व में बदल देता है o, फिर रिक्त स्थान के बीच सभी चाल (ग्राफ किनारों) को ढूंढता है, फिर यह पता चलता है कि कौन से चालें संभव हैं (भरे हुए स्थानों में नहीं), फिर आंकड़े बताते हैं कि कौन से संभावित चालें हैं " दो टुकड़ों के बीच से गुजरने के लिए गेट्स, फिर पता चलता है कि क्या गेट खुला है (पंजे, विपरीत रंग) या बंद (एक ही रंग और एक गैर-प्यादा सहित)। फिर, यह निचले बाएँ वर्ग से पथों द्वारा पहुंच योग्य स्थानों को खोजने के लिए चलता है और यदि कोई पथ 64 अंतरिक्ष तक पहुंच सकता है, तो यह एक हाँ बोर्ड है।


1
ठंडा। क्या आपने मेरे उदाहरण के खिलाफ इसका परीक्षण किया था, यह सुनिश्चित करने के लिए कि यह प्रत्येक के लिए सही परिणाम देता है? इसके अलावा, चूंकि यह एक कोड-गोल्फ प्रश्न है, इसलिए आपको वास्तव में इसे गोल्फ करना चाहिए। यदि और कुछ नहीं, तो क्या आप इंडेंटेशन से छुटकारा पा सकते हैं (या इसे चार जगहों के बजाय एक सिंगल स्पेस या टैब बना सकते हैं)? और / या =एस के चारों ओर रिक्त स्थान ड्रॉप ? (मुझे नहीं पता MATLAB: शायद वे असंभव हैं।)
msh210

हाँ, और मैं अपने अगले ब्रेक के दौरान कुछ कर सकता हूँ। मैंने इसे आपके सभी उदाहरणों और फिर कुछ के खिलाफ परीक्षण किया। क्या मुझे इसका संकेत देना चाहिए?
सिंटेक्स

पता नहीं; मैं बस सोच रहा था।
msh210
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.