शतरंज की बिसात पर धमाका


14

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

अस्वीकरण: धमाका ध्वनि प्रभाव शामिल नहीं है।

इनपुट

बोर्ड की स्थिति फोर्शिथ-एडवर्ड्स नोटेशन (आमतौर पर एफईएन के रूप में जाना जाता है) में दी जाएगी, लेकिन केवल पहले क्षेत्र के साथ। उदाहरण के लिए, इनपुट:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR

प्रारंभिक स्थिति का प्रतिनिधित्व करता है:

शतरंज की शुरुआत की स्थिति।

इसे एक स्ट्रिंग या आपकी भाषा के समकक्ष के रूप में लिया जाना चाहिए। यह मान्य होने की गारंटी है; उदाहरण के लिए, यदि दस राजा हों, या यदि कोई राजा नहीं है, तो आपको परवाह नहीं है।

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

e2e4

यह भी एक स्ट्रिंग के रूप में लिया जाना चाहिए। चाल हमेशा मान्य होगी, और आपको कास्टलिंग का समर्थन करने की आवश्यकता नहीं है । आपको एन पासेंट का समर्थन करने की आवश्यकता है , जिसे अगले खंड में आगे विस्तार से समझाया जाएगा।

उत्पादन

आपके कार्यक्रम का आउटपुट इनपुट के रूप में एक ही आंशिक-एफईएन संकेतन में होना चाहिए, निर्दिष्ट चाल के साथ (और यदि आवश्यक हो तो किसी भी टुकड़े में विस्फोट हो गया)।

विस्फोट के सटीक नियम हैं - जब कोई टुकड़ा पकड़ा जाता है:

  • कब्जा किया जा रहा टुकड़ा निकालें (यह इनपुट में नामित दूसरे वर्ग पर हमेशा टुकड़ा होगा, सिवाय इसके कि जब कब्जा एक एन पासेंट है )।

  • उस टुकड़े को निकालें जो कैप्चरिंग कर रहा है (यह इनपुट में नामित पहले वर्ग पर हमेशा टुकड़ा होगा)।

  • प्रत्येक टुकड़ा निकालें जो है:

    • 8 में से एक पर स्थित है, जहां कब्जा हुआ है ( एन पास के लिए , यह वर्ग है कि कैप्चरिंग पॉन पर होगा, अगर यह विस्फोट नहीं हुआ)।

    • मोहरा नहीं।

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

परीक्षण के मामलों

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

इनपुट: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR, g1f3
आउटपुट:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
टेस्ट केस 1


इनपुट: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK, f2g3
आउटपुट: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
टेस्ट केस २।
(से चोरी http://en.lichess.org/ocoSfS5I/white#36 )


इनपुट: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R, f3b7
आउटपुट: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
टेस्ट केस 3।
(से चोरी http://en.lichess.org/NCUnA6LV/white#14 )


इनपुट: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R, e5d6
आउटपुट: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
टेस्ट केस 4।
(से चोरी http://en.lichess.org/AvgU4Skq/white#16 , यह वास्तविक कदम नहीं था, लेकिन मैं एक परमाणु खेल को खोजने के लिए परेशान नहीं किया जा सकता है कि वास्तव में था अंपैसां: पी)


इनपुट: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q, c6h1
आउटपुट: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
टेस्ट केस 5।
(से चोरी http://en.lichess.org/l77efXEb/white#58 )

स्कोरिंग

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।


तो ... अपने राजा के साथ एक टुकड़ा लेना एक बुरा विचार है?
mbomb007

@ mbomb007 आपको अपने राजा के साथ टुकड़े लेने की अनुमति नहीं है। : पी
दरवाज़े

मुझसे गलती हो सकती है, लेकिन हमें कैसे पता होना चाहिए कि क्या एन पासिंग कैप्चर संभव है? आपके उदाहरण में अंतिम चाल को खाली हरे वर्ग द्वारा निरूपित किया जाता है, इसलिए काले पंजे को पास में रखा जा सकता है। लेकिन यह जानकारी हमारे द्वारा दिए गए इनपुट में निहित नहीं है, इसलिए सटीक एक ही बोर्ड होना संभव है, लेकिन जहां एन पासिंग कैप्चर संभव नहीं है, क्योंकि अंतिम चाल एक दो स्थान आगे की चाल नहीं थी।
घातक

1
@Fatalize " कदम हमेशा मान्य होगा " - "इनपुट" अनुभाग से।
दरवाज़े

पूरा कार्यक्रम या समारोह?
edc65

जवाबों:


5

जावास्क्रिप्ट ( ईएस 6 ) 305 310 321

2 वास्तविक मापदंडों के साथ एक फ़ंक्शन के रूप में (और डिफ़ॉल्ट मान के साथ बहुत अधिक, स्थानीय लोगों को परिभाषित करने के लिए एक त्वरित और गंदे तरीके के रूप में उपयोग किया जाता है)

नीचे स्निपेट का परीक्षण करना (EcmaScript 6, Firefox केवल)

F=(g,m,b=[...g.replace(/\d/g,c=>'0'.repeat(c))],P=p=>p=='p'|p=='P',n=parseInt(m,32),
  s=n>>5&31,u=n>>15,x=b[y=u+62-(n>>10&31)*9])=>(
  b[b[y]=0,z=s+62-(n&31)*9]<1&!(s!=u&P(x))?b[z]=x:
  [-1,1,8,9,10,-8,-9,-10].map(i=>b[i+=z]>'/'&&!P(b[i])?b[i]=0:0,b[b[z]<1?z>y?z-9:z+9:z]=0),
  b.join('').replace(/0+/g,x=>x.length)
)

//TEST
out=x=>O.innerHTML+=x+'\n'

test=[
 ['rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR', 'g1f3'
  ,'rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R']
,['3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK', 'f2g3'
  ,'3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK']  
,['rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R', 'f3b7'
  ,'3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R']
,['rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R', 'e5d6'
  ,'rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R']
,['5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q', 'c6h1'
  ,'5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2']
]

test.forEach(t=>( 
  r=F(t[0],t[1]), 
  out('Test '+(r==t[2]?'Ok':'Fail!')+'  '+t[0]+' move '+t[1]
     +'\nResult   '+r+'\nExpected '+t[2]+'\n')))
<pre id=O></pre>

Ungolfed

B=(b,m)=>{
  P=p=>p=='p'|p=='P'
  m=parseInt(m,32) 
  r=m&31 // arrival row
  s=(m/32&31)-10 // arrival column
  z=s+(8-r)*9 // arrival position
  t=m/32/32&31 // start row
  u=(m/32/32/32&31)-10 // start column
  y=u+(8-t)*9 // start position
  b=[...b.replace(/\d/g,c=>'0'.repeat(c))] // board to array, empty squares as 0
  x=b[y] // moving piece
  b[y]=0 
  C=s!=u&P(x) // pawn capture
  if (b[z]<1 && !C)
  {  // no capture
    b[z]=x
  }
  else
  {
    // capture and boom!
    if (b[z]<1) // arrival empty: en passant
      b[z>y?z-9:z+9]=0;
    else
      b[z]=0;
    // zero to nearest 8 squares
    [-1,1,8,9,10,-8,-9,-10].forEach(i=>b[i+=z]>'/'&&!P(b[i])?b[i]=0:0)
  }
  return b.join('').replace(/0+/g,x=>x.length)
}

1
वाह, कि मेरे समाधान की तुलना में बहुत सरल लगता है ... अच्छा काम!
सेमीक्सू

2

जावा, ( 946 777 776 वर्ण)

1 संस्करण @ edc65 के लिए धन्यवाद

नोट: बिना परीक्षण के मामलों में गिने जाने वाले चार्ट।

कोड

class E{public static void main(String[]a){String i=a[0];char[]n=a[1].toCharArray();int j,k,z,w,y,u=56-n[3];char q,p,e ='e';char[][]b=new char[8][8];String[]r=i.split("/");for(j=0;j<8;j++){z=0;for(k=0;k<r[j].length();k++){p=r[j].charAt(k);if(Character.isDigit(p)){for(int l=k+z;l<k+z+p-48;l++)b[j][l]=e;z+=p-49;}else b[j][k+z]=p;}}z=n[0]-97;w=56-n[1];y=n[2]-97;p=b[w][z];q=b[u][y];b[w][z]=e;if(q!=e||((p|32)=='p'&&(w-u<0?u-w:w-u)==1&&(z-y<0?y-z:z-y)==1)){if(q!=e)b[u][y]=e;else b[w][y]=e;for(j=y-(y==0?0:1);j<y+(y==8?0:y==7?1:2);j++){for(k=u-(u==0?0:1);k<u+(u==8?0:u==7?1:2);k++)if((b[k][j]|32)!='p')b[k][j]=e;}}else b[u][y]=p;i="";for(j=0;j<8;j++){z=0;for(k=0;k<8;k++){if(b[j][k]==e)z++;else {if(z>0){i+=z;z=0;}i+=b[j][k];}}if(z>0)i+=z;i+=j!=7?"/":"";}System.out.print(i);}}

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

व्याख्या

  • बोर्ड स्ट्रिंग को एक चार मैट्रिक्स में अनपैक करें
  • चाल के प्रभाव की गणना करें
  • बोर्ड को एक स्ट्रिंग में दोहराएं

विस्तारित

class ExplosionChess{
    public static void main(String[]a){
        String i=a[0];
        //"rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R";
        //"f3b7";
        char[]n=a[1].toCharArray();
        int j,k,z,w,y,u=56-n[3];
        char q,p,e ='e';
        char[][]b=new char[8][8];
        String[]r=i.split("/");
        for(j=0;j<8;j++){
            z=0;
            for(k=0;k<r[j].length();k++){
                p=r[j].charAt(k);
                if(Character.isDigit(p)){
                    for(int l=k+z;l<k+z+p-48;l++)
                        b[j][l]=e;
                    z+=p-49;
                }else 
                    b[j][k+z]=p;
            }
        }
        z=n[0]-97;
        w=56-n[1];
        y=n[2]-97;
        p=b[w][z];
        q=b[u][y];
        b[w][z]=e;
        if(q!=e||((p|32)=='p'&&(w-u<0?u-w:w-u)==1&&(z-y<0?y-z:z-y)==1)){
            if(q!=e)
                b[u][y]=e;
            else
                b[w][y]=e;
            for(j=y-(y==0?0:1);j<y+(y==8?0:y==7?1:2);j++){
                for(k=u-(u==0?0:1);k<u+(u==8?0:u==7?1:2);k++)
                    if((b[k][j]|32)!='p')
                        b[k][j]=e;
            }
        }else 
            b[u][y]=p;
        i="";
        for(j=0;j<8;j++){
            z=0;
            for(k=0;k<8;k++){
                if(b[j][k]==e)
                    z++;
                else {
                    if(z>0){
                        i+=z;
                        z=0;
                    }
                    i+=b[j][k];
                }
            }
            if(z>0)
                i+=z;
            i+=j!=7?"/":"";
        }
        System.out.print(i);
    }
}

पुराना

class E{public static void main(String[]a){String m,i="rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R";m="f3b7";char[]n=m.toCharArray();int z,w,y,u=56-n[3];z=n[0]-97;w=56-n[1];y=n[2]-97;char e='e';char[][]b=new char[8][8];String[]r=i.split("/");for(int j=0;j<8;j++){int o=0;for(int k=0;k<r[j].length();k++){char q=r[j].charAt(k);if(Character.isDigit(q)){for(int l=k+o;l<k+o+q-48;l++){b[j][l]=e;}o+=q-49;}else b[j][k+o]=q;}}char q,p=b[w][z];q=b[u][y];b[w][z]=e;if(q==e){if((p|32)=='p'&&(w-u<0?u-w:w-u)==1&&(z-y<0?y-z:z-y)==1){b[w][y]=e;for(int j=y-(y==0?0:1);j<y+(y==8?0:y==7?1:2);j++){for(int k=u-(u==0?0:1);k<u+(u==8?0:u==7?1:2);k++){if((b[k][j]|32)!='p')b[k][j]=e;}}}else{b[u][y]=p;}}else{b[u][y]=e;for(int j=y-(y==0?0:1);j<y+(y==8?0:y==7?1:2);j++){for(int k=u-(u==0?0:1);k<u+(u==8?0:u==7?1:2);k++){if((b[k][j]|32)!='p')b[k][j]=e;}}}i="";for(int j=0;j<8;j++){int x=0;for(int k=0;k<8;k++){if(b[j][k]==e)x++;else{if(x>0){i+=x;x=0;}i+=b[j][k];}}if(x>0)i+=x;i+=j!=7?"/":"";}System.out.println(i);}}

String m,i="";m="";char[]n=m.toCharArray()-> String i=a[0];char[]n=a[1].toCharArray()छोटा है और इसलिए आपको बाहर से पैरामीटर मिलते हैं (जैसा कि आपको वैसे भी होना चाहिए )
edc65

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