체스 판에 폭발


14

원자 체스 는 모든 캡처가 "폭발"을 일으키고 캡처 된 조각을 파괴하는 조각, 캡처하는 조각, 그리고 1 제곱 반경의 모든 풋이 아닌 체스 의 (매우 재미있는) 변형입니다. 이 도전의 목표는 전체 원자 체스 게임을하는 것이 아니라 특정 움직임이있을 때 일어나는 일을 시뮬레이션하는 것입니다.

면책 조항 : 폭발음 효과는 포함되어 있지 않습니다.

입력

보드 위치는 Forsyth-Edwards 표기법 (일반적으로 FEN)으로 제공되지만 첫 번째 필드 만 제공됩니다. 예를 들어 다음과 같은 입력이 있습니다.

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

시작 위치를 나타냅니다.

체스 시작 위치.

이것은 문자열 또는 해당 언어와 동일해야합니다. 유효한 것으로 보장됩니다. 예를 들어 열 왕이 있거나 전혀 왕이없는 경우에는 신경 쓸 필요가 없습니다.

또한 시뮬레이션 할 이동이 제공되는데, 이는 두 개의 정사각형 이름으로 표시됩니다. 이동 될 정사각형과 이동하는 정사각형. 예를 들어, 위의 그림에서 왕의 폰을 두 칸 앞으로 이동하면 다음과 같이 표현됩니다.

e2e4

또한 문자열로 가져와야합니다. 이동은 항상 유효하며 castling 을 지원할 필요는 없습니다 . enpassant 를 지원해야합니다 . 자세한 내용은 다음 섹션에서 설명합니다.

산출

프로그램의 출력은 입력과 동일한 부분 FEN 표기법으로 지정해야하며 지정된 이동이 필요합니다 (필요한 경우 조각 분해).

폭발에 대한 정확한 규칙은 다음과 같습니다.

  • 캡처중인 조각을 제거합니다 (캡처가 동반자 인 경우를 제외하고 항상 입력에서 이름이 지정된 두 번째 사각형의 조각 임).

  • 캡처를 수행하는 조각을 제거합니다 (항상 입력에 이름이 지정된 첫 번째 사각형의 조각 임).

  • 다음과 같은 모든 부분을 제거하십시오.

    • 캡처가 일어난 하나 주변 8 개 사각형 중 하나에 위치한 (대한 EN 옆모습을 ,이는 폭발하지 않은 경우 캡처 폰에 될 것이라고 광장입니다).

    • 폰이 아닙니다.

익숙하지 않은 사람들을위한 패시브 룰에 대한 빠른 개요 : 폰이 시작 순위에서 두 칸 앞으로 이동하고, 한 칸 앞으로 만 움직여서 그것을 잡을 수있는 폰이 있다면 어쨌든 붙잡을 수 있습니다. 후속 이동에서만. 이 캡처는 " 전달 "(또는 프랑스어 : " en passant ") 에서 수행된다고합니다 .

테스트 사례

그림에서 녹색 화살표는 이동하려는 움직임을 다시 표시하고 녹색 원은 폭발 한 조각을 나타냅니다.

입력 : 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
테스트 사례 2.
( 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 왕과 함께 조각을 가져갈 수 없습니다. : P
Doorknob

내가 틀렸을 수도 있지만, 동시 포착이 가능한지 어떻게 알 수 있습니까? 귀하의 예에서 마지막 움직임은 빈 녹색 사각형으로 표시되므로, 발을 딛은 검은 색을 병행하여 캡처 할 수 있습니다. 그러나이 정보는 우리가 제공 한 입력에 포함되어 있지 않으므로 정확히 동일한 보드를 가질 수는 있지만 마지막 이동이 두 칸 앞으로 이동하지 않았기 때문에 통과 캡처가 불가능한 곳이 가능합니다.
치명적인

1
@Fatalize " 입력"섹션에서 " 이동은 항상 유효합니다 ".
Doorknob

완전한 프로그램 또는 기능?
edc65

답변:


5

자바 스크립트 ( ES6 ) 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>

언 골프

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
와우, 그건 내 솔루션보다 훨씬 간단 해 보인다 ... 잘 했어!
cmxu

2

자바, ( 946 개 777 776 문자)

@ edc65 덕분에 1 문자

참고 : 테스트 사례가없는 문자는 계산됩니다.

암호

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.