দাবা বোর্ডে বিস্ফোরণ


14

পারমাণবিক দাবা দাবা একটি (খুব মজাদার) রূপ যা প্রতিটি ক্যাপচার একটি "বিস্ফোরণ" ঘটায়, ক্যাপচার করা টুকরো, ক্যাপচারিং টুকরা এবং 1-বর্গ ব্যাসার্ধে সমস্ত অ-পাউন্ডকে ধ্বংস করে দেয়। এই চ্যালেঞ্জের লক্ষ্যটি হ'ল পারমাণবিক দাবা পুরো গেমটি খেলানো নয়, তবে কোনও নির্দিষ্ট পদক্ষেপ নেওয়া হলে কী ঘটে তা কেবল অনুকরণ করা।

দাবি অস্বীকার: বিস্ফোরণ শব্দ প্রভাব অন্তর্ভুক্ত করা হয়নি।

ইনপুট

বোর্ড পজিশনটি ফোর্সিথ-এডওয়ার্ডস নোটেশন (সাধারণত FEN হিসাবে পরিচিত) এ দেওয়া হবে তবে কেবল প্রথম ক্ষেত্রের সাথে। উদাহরণস্বরূপ, এর একটি ইনপুট:

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

প্রারম্ভিক অবস্থান প্রতিনিধিত্ব করে:

দাবা শুরু অবস্থান।

এটি অবশ্যই একটি স্ট্রিং বা আপনার ভাষার সমতুল্য হিসাবে নেওয়া উচিত। এটি বৈধ হওয়ার গ্যারান্টিযুক্ত; উদাহরণস্বরূপ, দশ জন রাজা থাকলে বা কোনও রাজা না থাকলে আপনার যত্ন নেওয়ার দরকার নেই।

আপনি যে অনুকরণটি করতে চান তাও আপনাকে দেওয়া হবে, যা দুটি বর্গাকার নাম হিসাবে উপস্থাপিত: টুকরোটি যে বর্গক্ষেত্রে সরানো হবে এবং বর্গটি সেটিতে চলেছে। উদাহরণস্বরূপ, উপরের ছবিতে রাজার মনোরম দুটি স্পেস এগিয়ে নিয়ে যাওয়া উপস্থাপিত হবে:

e2e4

এটি অবশ্যই স্ট্রিং হিসাবে নেওয়া উচিত। পদক্ষেপটি সর্বদা বৈধ থাকবে এবং আপনাকে কাস্টিং সমর্থন করার প্রয়োজন নেই । আপনার এন পাসেন্টকে সমর্থন করা দরকার যা পরবর্তী বিভাগে আরও বিস্তারিতভাবে ব্যাখ্যা করা হবে।

আউটপুট

আপনার প্রোগ্রামের আউটপুট ইনপুট হিসাবে একই আংশিক-FEN সংকেত হওয়া উচিত, নির্দিষ্ট সরানো (এবং প্রয়োজনে কোনও টুকরো বিস্ফোরিত) দিয়ে।

বিস্ফোরণের সঠিক নিয়মগুলি হ'ল - কোনও টুকরো ধরা পড়লে:

  • ক্যাপচার হওয়া টুকরোটি সরান (ক্যাপচারটি এন পাসেন্ট ব্যতীত এটিকে ইনপুটটিতে চিহ্নিত দ্বিতীয় বর্গের সর্বদা টুকরোটি করা হবে )।

  • ক্যাপচারিং করছে এমন টুকরোটি সরান (এটি সর্বদা ইনপুটটির নামযুক্ত প্রথম স্কোয়ারের টুকরো হবে)।

  • প্রতিটি টুকরা যেটি সরান:

    • আটটি স্কোয়ারের একটিতে যেখানে ক্যাপচারটি ঘটেছিল তার একটিতে অবস্থিত ( উদাহরণস্বরূপ , এটি এমন বর্গ যা ক্যাপচারিং প্যাডটি চালু ছিল, যদি এটি বিস্ফোরিত না হয়)।

    • একটি গিরি না

যাঁরা অপরিচিত তাদের পক্ষে পাসের নিয়মগুলির দ্রুত পর্যালোচনা : যদি কোনও উদ্যান তার প্রারম্ভিক র‌্যাঙ্ক থেকে দুটি স্পেস এগিয়ে নিয়ে যায় এবং এমন একটি প্যাঁচ থাকে যা এটি কেবল একটি বর্গক্ষেত্রকে এগিয়ে নিয়ে যেতে পারত তবে তা এটি যেভাবেই ক্যাপচার করতে পারে, তবে কেবল পরবর্তী পদক্ষেপে। এই ক্যাপচারটি " পাসিং " (অথবা ফরাসি ভাষায়: " এন পাসেন্ট ") সম্পন্ন হওয়ার কথা বলা হয়।

পরীক্ষার মামলা

ছবিগুলিতে, সবুজ তীরগুলি তৈরি হওয়া সম্পর্কে স্থানান্তরকে নিন্দা করে এবং সবুজ চেনাশোনাগুলি বিস্ফোরিত হওয়া টুকরোগুলি উপস্থাপন করে।

ইনপুট: 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
পরীক্ষার মামলা ২।
(থেকে চুরি http://en.lichess.org/ocoSfS5I/white#36 )


ইনপুট: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R, f3b7
আউটপুট: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
পরীক্ষার মামলা ৩।
(থেকে চুরি http://en.lichess.org/NCUnA6LV/white#14 )


ইনপুট: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R, e5d6
আউটপুট: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
পরীক্ষার মামলা ৪।
(থেকে চুরি http://en.lichess.org/AvgU4Skq/white#16 ; এই প্রকৃত পদক্ষেপ ছিল না, কিন্তু আমি একটি পারমাণবিক খেলা এটি বিরক্ত করা যাবে না যে আসলে ছিল প্রসঙ্গক্রমে: পি)


ইনপুট: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q, c6h1
আউটপুট: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
পরীক্ষার মামলা ৫।
(থেকে চুরি http://en.lichess.org/l77efXEb/white#58 )

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


তো ... তোমার রাজার সাথে টুকরো টুকরো করা কি খারাপ ধারণা?
mbomb007

@ mbomb007 আপনার রাজার সাথে টুকরো টুকরো করার অনুমতি নেই। : পি
ডুরকনব

আমার ভুল হতে পারে তবে এন পাসেরেন্ট ক্যাপচার সম্ভব কিনা তা আমরা কীভাবে জানতে পারি? আপনার উদাহরণে সর্বশেষ পদক্ষেপটি খালি সবুজ বর্গ দ্বারা চিহ্নিত করা হয়েছে, তাই কালো প্যাঁকানো উত্তেজক অবস্থায় ধরা পড়তে পারে। তবে এই তথ্যটি আমাদের দেওয়া ইনপুটগুলিতে অন্তর্ভুক্ত নেই, সুতরাং সঠিক বোর্ড একইভাবে পাওয়া সম্ভব তবে যেখানে এন পাসের ক্যাপচার সম্ভব নয়, কারণ শেষ পদক্ষেপটি দুটি ফাঁকা স্থানের অগ্রসর পদক্ষেপ ছিল না।
ফ্যাটালাইজ করুন

1
@ ফ্যাটালাইজ করুন " সরানো সর্বদা কার্যকর হবে " - "ইনপুট" বিভাগ থেকে।
ডোরকনবব

সম্পূর্ণ প্রোগ্রাম বা ফাংশন?
edc65

উত্তর:


5

জাভাস্ক্রিপ্ট ( ES6 ) 305 310 321

2 রিয়েল প্যারামিটার সহ একটি ফাংশন হিসাবে (এবং ডিফল্ট মান সহ আরও অনেক কিছু, স্থানীয়দের সংজ্ঞা দেওয়ার জন্য দ্রুত এবং নোংরা উপায় হিসাবে ব্যবহৃত হয়)

নীচে স্নিপেট চলমান পরীক্ষা করুন (শুধুমাত্র এক্সমা স্ক্রিপ্ট,, কেবল ফায়ারফক্স)

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
বাহ, এটি আমার সমাধানের চেয়ে অনেক সহজ দেখাচ্ছে ... চমৎকার কাজ!
সেমিxসু

2

জাভা, ( 946 777 776 অক্ষর)

@ চরকে ধন্যবাদ 1 এডক 65

দ্রষ্টব্য: পরীক্ষার মামলা ছাড়াই গণনা করা অক্ষর।

কোড

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);}}

আমি নিশ্চিত না যে এই সমাধানটি অনুকূল কিনা, তবে আমি এটি আরও গল্ফ করে কাজ করছি, যে কোনও পরামর্শই স্বাগত welcome কেউ চাইলে আমি সমস্ত কোডও মন্তব্য করতে পারি, তবে আমি মনে করি এটি বিভ্রান্তিকর পরিবর্তনশীল গণনা ব্যতীত বেশিরভাগ ক্ষেত্রে স্ব-বর্ণনামূলক।

ব্যাখ্যা

  • বোর্ড স্ট্রিংটিকে একটি চর ম্যাট্রিক্সে আনপ্যাক করুন
  • পদক্ষেপের প্রভাব গণনা করুন
  • বোর্ডটিকে একটি স্ট্রিংতে পুনরায় প্রতিবেদন করুন

সম্প্রসারিত

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

আহ্, ঠিক আছে আমি ওটা বদলাব, ধন্যবাদ!
সেএমএক্সসু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.