체스-오션 더비


16

체스와 철거 더비 보다 더 정반대가 될 수있는 것 . 당신은 어느 날을 즐기는 사람은 오늘까지 다른 사람을 즐기지 않을 것이라고 생각할 것입니다.

규칙

시작 위치는 표준 체스 판입니다.

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

당신이 그것이 ITLESF에 대한 모든 조각, 마지막 조각 스탠딩 경쟁 이라는 것을 알 때까지는 정상적으로 보입니다 .

  • 매 턴마다, 보드의 각 조각은 무작위로 선택된 * 하나의 유효한 이동을합니다 (표준 이동 규칙 사용). 그러나 조각이 움직이는 순서는 매 턴마다 무작위 입니다.
  • 작품은 같은 색, 심지어 왕이라도 모든 조각을 포착 할 수 있습니다 .
  • 졸은 캡처 할 수 있습니다 FORWARD을 대각선뿐만 아니라. 더욱이, 보통처럼, 그 앞에 빈 공간이 있다면, 폰은 첫 번째 움직임에서 두 칸을 움직일 수 있습니다 (그들은 또한 그런 식으로 캡처 할 수 있습니다). 또한 폰은 킹 이외의 임의의 조각 (킹 포함)으로 승진합니다 폰.
  • 승자는 마지막 작품입니다. 그러나 후에 1000 턴 남은 조각이 둘 이상 있으면 나머지 조각이 모두 승자입니다.
  • En Passant, Check, Castle 등

산출

매 턴마다 턴 번호와 보드 모양을 출력합니다. 조각이 죽으면 보드에서 제거됩니다. 첫 턴 후 보드는 다음과 같이 보일 수 있습니다.

1.
   K    
RBQ N BR  
NP  P P
  PP P P
R PP
BPN PNP
    K  R 
       Q

1000 이동 후 보드는 다음과 같습니다.

1000.
  Q  K


P  N R

 R  B N   

  Q

그리고 게임은 끝납니다.

또는 556 회전 후 보드는 다음과 같습니다.

556.


     아르 자형





게임은 거기서 끝납니다.

*이 챌린지에서 수행 된 모든 무작위 배정은 균일해야합니다 (모든 가능성은 동일하게 발생합니다).


폰이 대각선으로 움직이지 않고 캡처 할 수 있다면, 캡처하지 않고 대각선으로도 움직일 수 있습니까?
trichoplax

1
@ 트리 아니, 안돼.
geokavel

폰이 이중으로 움직일 때 한 번에 두 조각을 캡처 할 수 있습니까?
orlp

1
@orlp 아니오, 분명히해야합니다. 앞에 빈 공간이 있으면 두 개만 이동할 수 있습니다.
geokavel

1
또한 예제에서 폰을 서로 다른 방향으로 움직이므로 폰을 흑백으로 구분해야합니다 ( p흑백 PFEN 표준입니다 ).
mbomb007

답변:


3

파이썬 2 , 862 846 844 바이트

from random import*
A=-1;a,b=[(0,1),(0,A),(A,0),(1,0)],[(A,A),(A,1),(1,A),(1,1)]
r=range(8)
C='RNBQK';q=C+'BNR'
def m(x,y,B,t):
 P=B[y][x];M=[]
 for w,z in dict(zip('pP'+C,[[],[],a,zip([A,1,-2,2]*2,[2,2,1,1,-2,-2,A,A]),b]+[a+b]*2))[P]:
	for i in r[1:]:
	 X,Y=x+z*i,y+w*i;M+=(X,Y),
	 if P in'NK'or 1-(8>X>A<Y<8)or' '<B[Y][X]:break
 if P in'pP':d=[A,1][P<'p'];M=zip((x-1,x,x+1)[B[y+d][x-1]<'!':2+(B[y+d][-~x%8]>' ')],(y+d,)*3)+[(x,y+2*d)]*(t*B[y+d][x]<'!')
 return choice([(X,Y)for X,Y in M if-1<X<8>Y>A])
B=map(list,[q,'P'*8]+[' '*8]*4+['p'*8,q])
t=0
while t<1e3:
 t+=1;p=[(x,y)for y in r for x in r if' '<B[y][x]];shuffle(p)
 if len(p)<2:break
 while p:x,y=p.pop();Z=X,Y=m(x,y,B,t<2);B[Y][X],B[y][x]=B[y][x],' ';Z in p and p.remove(Z)
 for j in 0,7:
	for i in r:
	 if B[j][i]in'pP':B[j][i]=choice(C)
 print t
 for l in B:print''.join(l).upper()

온라인으로 사용해보십시오!

Jonathan Frech 덕분에 18 바이트 절약


855 바이트 (완전히 테스트되지 않음).
Jonathan Frech


또는 일 ...]+[(a+b)]*2수 있다고 생각 합니다 . ...]+[a+b]*2...,a+b,a+b]
Jonathan Frech

0

PHP, 1849 바이트

<?$z=[R,N,B,Q,K,B,N,R];$y=[_,_,_,_,_,_,_,_];$u=shuffle;$b=[$z,[P,P,P,P,P,P,P,P],$y,$y,$y,$y,[p,p,p,p,p,p,p,p],$z];$z=[R,N,B,Q,K];for($i=0;$i<8;$i++)for($j=0;$j<8;$j++)$r[]=[$i,$j];for(;$c++<=999;){for($i=$_=0;$i<8;$i++)for($j=0;$j<8;$j++)if($b[$i][$j]!=_)++$_;if($_<2)break;$u($r);$n=[];foreach($r as$l){list($y,$x)=$l;$a=$y+1;$d=$y-1;$j=$x+1;$t=$x-1;$p=$b[$y][$x];if($n[$y][$x]!=1&&$p!=_){$v=$e=$f=$g=$h=$k=$o=$q=$s=[];if($p==R||$p==K||$p==Q){$m=($p==K)?2:9;for($i=1;$i<$m;$i++){if(!$e&&$y-$i>=0){$v[]=[$y-$i,$x];if($b[$y-$i][$x]!=_)$e=1;}if(!$f&&$y+$i<8){$v[]=[$y+$i,$x];if($b[$y+$i][$x]!=_)$f=1;}if(!$g&&$x-$i>=0){$v[]=[$y,$x-$i];if($b[$y][$x-$i]!=_)$g=1;}if(!$h&&$x+$i<8){$v[]=[$y,$x+$i];if($b[$y][$x+$i]!=_)$h=1;}}}if($p==B||$p==K||$p==Q){$m=($p==K)?2:9;for($i=1;$i<$m;$i++){if(!$k&&$y-$i>=0&&$x-$i>=0){$v[]=[$y-$i,$x-$i];if($b[$y-$i][$x-$i]!=_)$k=1;}if(!$o&&$y-$i>=0&&$x+$i<8){$v[]=[$y-$i,$x+$i];if($b[$y-$i][$x+$i]!=_)$o=1;}if(!$q&&$y+$i<8&&$x-$i>=0){$v[]=[$y+$i,$x-$i];if($b[$y+$i][$x-$i]!=_)$q=1;}if(!$s&&$y+$i<8&&$x+$i<8){$v[]=[$y+$i,$x+$i];if($b[$y+$i][$x+$i]!=_)$s=1;}}}if($p==N){if($y-2>=0&&$t>=0)$v[]=[$y-2,$t];if($y-2>=0&&$j<8)$v[]=[$y-2,$j];if($d>=0&&$x-2>=0)$v[]=[$d,$x-2];if($d>=0&&$x+2<8)$v[]=[$d,$x+2];if($a<8&&$x-2>=0)$v[]=[$a,$x-2];if($a<8&&$x+2<8)$v[]=[$a,$x+2];if($y+2<8&&$t>=0)$v[]=[$y+2,$t];if($y+2<8&&$j<8)$v[]=[$y+2,$j];}if($p==P){if($y==1&&$b[$a][$x]==_)$v[]=[$y+2,$x];if($j<8&&$b[$a][$j]!=_)$v[]=[$a,$j];if($t>=0&&$b[$a][$t]!=_)$v[]=[$a,$t];$v[]=[$a,$x];}if($p==p){if($y==6&&$b[$d][$x]==_)$v[]=[$y-2,$x];if($j<8&&$b[$d][$j]!=_)$v[]=[$d,$j];if($t>=0&&$b[$d][$t]!=_)$v[]=[$d,$t];$v[]=[$d,$x];}$u($v);$v=$v[0];$b[$y][$x]=_;$w=$p;if($w==P&&$v[0]>6&&$u($z)&&$w=$z[0]);if($w==p&&$v[0]<1&&$u($z)&&$w=$z[0]);$b[$v[0]][$v[1]]=$w;$n[$v[0]][$v[1]]=1;}}echo $c.".
";foreach($b as$a)echo str_replace([_,p],[' ',P],join("",$a))."
";}

온라인으로 사용해보십시오!

그것은 할 수 있습니다 확실히 더 골프를 질 수 있고, 그것은 미친 사람의 일처럼 보입니다.

무작위 움직임이 얼마나 빨리 보드를 지울 수 있는지에 감동합니다 (15 움직임이 그것을 보았습니다). 또한 제가 1000 점에 도달 한 유일한 것은 다른 색으로 춤을 추는 두 명의 주교였습니다.

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