Bir satranç tahtası üzerinde patlamalar


14

Atomik satranç , her yakalamanın bir "patlamaya" neden olduğu, yakalanan parçayı, yakalamayı yapan parçayı ve 1 kare yarıçapındaki tüm piyon olmayanların satıldığı (çok eğlenceli) bir satranç çeşididir. Bu zorluğun amacı bütün bir atom satrancı oyunu oynamak değil, sadece belirli bir hamle yapıldığında ne olacağını simüle etmektir.

Yasal Uyarı: Patlama ses efektleri dahil değildir.

Giriş

Tahta pozisyonu Forsyth-Edwards Notasyonunda (genellikle FEN olarak bilinir), ancak sadece ilk alanla verilecektir. Örneğin, aşağıdakilerin bir girdisi:

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

başlangıç ​​pozisyonunu temsil eder:

Satranç başlangıç ​​pozisyonu.

Bu bir dize veya dilinizin eşdeğeri olarak alınmalıdır. Geçerli olduğu garanti edilir; örneğin, on kral olup olmadığını ya da hiç kral olmadığını umursamanız gerekmez.

Ayrıca, simüle edeceğiniz, iki kare adı olarak gösterilen hareket verilecektir: taşınacak parçanın bulunduğu kare ve taşındığı kare. Örneğin, kralın piyonunu yukarıdaki resimde iki boşluk ileriye taşımak şu şekilde temsil edilir:

e2e4

Bu bir dize olarak da alınmalıdır. Hareket her zaman geçerli olacak ve yayınlamayı desteklemenize gerek yok . Bir sonraki bölümde daha ayrıntılı olarak açıklanacak olan yolcuları desteklemeniz gerekir .

Çıktı

Programınızın çıktısı, belirtilen hareketle (ve gerekirse parçaların patlamasıyla) girişle aynı kısmi-FEN gösteriminde olmalıdır.

Patlamalar için kesin kurallar - bir parça ele geçirildiğinde:

  • (Yakalama, bir zamanlar için hariç, bu her zaman giriş adlandırılmış ikinci meydanda parça olacak parça yakalanan çıkarın.Bkz tr passant ).

  • Yakalamayı yapan parçayı kaldırın (bu her zaman girişte adlandırılan ilk karedeki parça olacaktır).

  • Aşağıdaki parçaları çıkarın:

    • ele geçirmenin gerçekleştiği yeri çevreleyen 8 kareden birinde yer alır ( en geç kişi için , bu patlayan piyonun patlamasaydı üzerinde olacağı karedir).

    • piyon değil.

Bilmediğiniz kişiler için en önemli kurallara hızlı bir genel bakış : Bir piyon başlangıç ​​seviyesinden iki boşluk ileri giderse ve sadece bir kare ileriye doğru hareket ederse yakalayabilecek bir piyon varsa, yine de yakalayabilir, ancak yine de sadece sonraki hamlede. Bu yakalamanın " geçerken " (ya da Fransızca: " en passant ") yapıldığı söylenir .

Test senaryoları

Resimlerde, yeşil oklar yapılacak hareketi temsil eder ve yeşil daireler patlatılmış parçaları temsil eder.

Girdi: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR, g1f3
Çıktı:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Test durumu 1.


Girdi: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK, f2g3
çıkış: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
Test durumu 2.
(çalınan http://en.lichess.org/ocoSfS5I/white#36 )


Girdi: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R, f3b7
çıkış: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
Test durumu 3.
(çalınan http://en.lichess.org/NCUnA6LV/white#14 )


Girdi: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R, e5d6
Çıktı: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
Test durumu 4.
(çalınan http://en.lichess.org/AvgU4Skq/white#16 ; bu gerçek hareket değil, ama bir atom oyun bulmak için rahatsız olamazdı aslında sahip olduğu en passant: P)


Girdi: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q, c6h1
çıkış: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
Test durumu 5.
(çalınan http://en.lichess.org/l77efXEb/white#58 )

puanlama

Bu , bu nedenle bayttaki en kısa kod kazanır.


Yani ... kralýnla bir parça almak kötü bir fikir mi?
mbomb007

@ mbomb007 Kralınızla birlikte taş atmanıza izin verilmiyor. : P
Kapı Tokmağı

Yanılıyor olabilirim, ancak enine yakalamanın mümkün olup olmadığını nasıl bilebiliriz? Örneğinizde son hareket boş yeşil kare ile gösterilir, böylece siyah piyon geçişte yakalanabilir. Ancak bu bilgiler bize verilen girdilerde yer almamaktadır, bu yüzden aynı tahtaya sahip olmak mümkündür, ancak en geç yakalamanın mümkün olmadığı yerde, çünkü son hareket iki boşluk ileriye doğru bir hareket değildi.
Fatalize

1
@Fatalize " Hareket her zaman geçerli olacak " - "Giriş" bölümünden.
Kapı Tokmağı

Tüm program veya fonksiyon?
edc65

Yanıtlar:


5

JavaScript ( ES6 ) 305 310 321

2 gerçek parametreye sahip bir işlev olarak (ve varsayılan değerlerle çok daha fazlası, yerelleri tanımlamak için hızlı ve kirli bir yol olarak kullanılır)

Aşağıdaki snippet'i çalıştırmayı test edin (yalnızca EcmaScript 6, Firefox olarak)

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
Vay, bu benim çözümümden çok daha basit görünüyor ... Güzel iş!
cmxu

2

Java, ( 946 777 776 karakter)

@ Edc65 sayesinde 1 karakter

Not: Karakterler test senaryoları olmadan sayılır.

kod

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

Bu çözümün optimal olup olmadığından emin değilim, ancak daha fazla golf oynamak için çalışıyorum, herhangi bir öneri bekliyoruz. Ben de herkes kodu tüm yorum yapabilirsiniz, ama kafa karıştırıcı değişken numaralandırma dışında, çoğunlukla kendini açıklayıcı olduğunu düşünüyorum.

açıklama

  • Kart dizesini bir char matrisine açma
  • Hareketin etkisini hesapla
  • Kartı bir dizeye yeniden paketleyin

Expanded

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

Eski

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()daha kısadır ve bu yüzden parametreleri dışarıdan alırsınız ( yine de olması gerektiği gibi )
edc65

Ahh, tamam bunu değiştireceğim, teşekkürler!
cmxu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.