Ledakan di papan catur

14

Atomic catur adalah varian (sangat menyenangkan) dari catur di mana setiap tangkapan menyebabkan "ledakan," menghancurkan bagian yang ditangkap, bagian yang melakukan penangkapan, dan semua non-bidak dalam radius 1-persegi. Tujuan dari tantangan ini bukan untuk memainkan seluruh permainan catur atom, tetapi hanya untuk mensimulasikan apa yang terjadi ketika langkah tertentu dilakukan.

Penafian: Efek suara ledakan tidak termasuk.

Memasukkan

Posisi dewan akan diberikan dalam Forsyth-Edwards Notation (umumnya dikenal sebagai FEN), tetapi hanya dengan bidang pertama. Misalnya, input dari:

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

mewakili posisi awal:

Posisi awal catur.

Ini harus diambil sebagai string atau padanan bahasa Anda. Dijamin valid; misalnya, Anda tidak perlu peduli jika ada sepuluh raja, atau jika tidak ada raja sama sekali.

Anda juga akan diberikan langkah yang akan disimulasikan, yang direpresentasikan sebagai dua nama kuadrat: kuadrat tempat keping yang akan dipindahkan, dan kuadrat tempat pijakan itu dipindahkan. Sebagai contoh, memindahkan pion raja dua spasi ke depan pada gambar di atas akan direpresentasikan sebagai:

e2e4

Ini juga harus diambil sebagai string. Langkah ini akan selalu valid, dan Anda tidak perlu mendukung castling . Anda perlu mendukung en passant , yang akan dijelaskan secara lebih rinci di bagian selanjutnya.

Keluaran

Output dari program Anda harus dalam notasi FEN parsial yang sama dengan input, dengan langkah yang ditentukan dibuat (dan setiap bagian meledak jika perlu).

Aturan pasti untuk ledakan adalah — saat sebuah karya diambil:

  • Hapus bagian yang sedang ditangkap (ini akan selalu menjadi bagian di kotak kedua yang disebutkan dalam input, kecuali ketika tangkapan adalah orang yang lewat ).

  • Hapus bagian yang melakukan penangkapan (ini akan selalu menjadi bagian pada kotak pertama yang disebutkan dalam input).

  • Hapus setiap bagian yang:

    • terletak di salah satu dari 8 kotak di sekitar kotak di mana penangkapan terjadi (bagi orang yang lewat , ini adalah kotak tempat bidak menangkap akan berada, jika tidak meledak).

    • bukan bidak.

Gambaran singkat dari en passant aturan, bagi mereka yang tidak terbiasa: jika pion bergerak dua ruang depan dari peringkat nya mulai, dan ada pion yang bisa ditangkap jika hanya bergerak satu persegi ke depan, mungkin menangkap hal itu, tapi hanya pada langkah selanjutnya. Penangkapan ini dikatakan dilakukan " secara sepintas " (atau dalam bahasa Prancis: " en passant ").

Uji kasus

Dalam gambar, panah hijau mewakili gerakan yang akan dibuat, dan lingkaran hijau mewakili potongan yang meledak.

Input: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR, g1f3
Output:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Test case 1.


Input: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK, f2g3
Output: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
Uji kasus 2.
(dicuri dari http://en.lichess.org/ocoSfS5I/white#36 )


Input: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R, f3b7
Output: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
Test case 3.
(dicuri dari http://en.lichess.org/NCUnA6LV/white#14 )


Input: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R, e5d6
Output: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
Test case 4.
(dicuri dari http://en.lichess.org/AvgU4Skq/white#16 , ini bukan yang sebenarnya bergerak, tapi aku tidak bisa diganggu untuk menemukan permainan atom yang benar-benar memiliki en passant: P)


Input: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q, c6h1
Output: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
Test case 5.
(dicuri dari http://en.lichess.org/l77efXEb/white#58 )

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.

Gagang pintu
sumber
Jadi ... mengambil sepotong dengan rajamu adalah ide yang buruk?
mbomb007
@ mbomb007 Anda tidak diizinkan membawa barang bersama raja Anda. : P
Doorknob
Saya mungkin salah, tetapi bagaimana kita bisa tahu jika penangkapan yang lewat itu mungkin? Dalam contoh Anda, langkah terakhir dilambangkan dengan kotak hijau kosong, sehingga pion hitam dapat ditangkap secara melintas. Tetapi informasi ini tidak terkandung dalam input yang diberikan kepada kami, sehingga dimungkinkan untuk memiliki papan yang sama persis tetapi di mana penangkapan en passant tidak dimungkinkan, karena langkah terakhir bukanlah dua langkah maju.
Fatalkan tanggal
1
@Fatalize " Pindahkan akan selalu valid " - dari bagian "Input".
Gagang Pintu
Program atau fungsi lengkap?
edc65

Jawaban:

5

JavaScript ( ES6 ) 305 310 321

Sebagai fungsi dengan 2 parameter nyata (dan lebih banyak lagi dengan nilai default, digunakan sebagai cara cepat dan kotor untuk mendefinisikan lokal)

Tes menjalankan cuplikan di bawah ini (menjadi EcmaScript 6, hanya 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>

Tidak disatukan

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)
}
edc65
sumber
1
Wow, itu terlihat jauh lebih sederhana daripada solusi saya ... Kerja bagus!
cmxu
2

Java, ( 946 777 776 karakter)

1 char terima kasih ke @ edc65

Catatan: Chars dihitung tanpa test case dimasukkan.

Kode

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

Saya tidak yakin apakah solusi ini optimal, tetapi saya sedang berusaha bermain golf lebih banyak, ada saran yang diterima. Saya dapat mengomentari semua kode juga jika ada yang mau, tapi saya pikir sebagian besar cukup jelas, kecuali untuk enumerasi variabel yang membingungkan.

Penjelasan

  • Buka paket string papan ke dalam matriks char
  • Hitung efek gerakan
  • Pasang kembali papan menjadi seutas tali

Diperluas

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

Tua

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);}}
cmxu
sumber
String m,i="";m="";char[]n=m.toCharArray()-> String i=a[0];char[]n=a[1].toCharArray()lebih pendek dan jadi Anda mendapatkan parameter dari luar (sebagaimana mestinya )
edc65
Ahh, oke saya akan mengubahnya, terima kasih!
cmxu