Дербі з шахових оліцій


16

Що може бути більш полярними протилежностями, ніж шахи та дербі знесення . Ви могли б подумати, що ніхто, хто насолоджується одним, не сподобається іншому ... до сьогодні.

Правила

Вихідне положення - це стандартна шахова дошка:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Виглядає досить нормально, поки ви не дізнаєтесь, що це КОЖНИЙ КРАЙ ДЛЯ САМОГО, ОСТАНОГО ПІКЕЙНОГО змагання:

  • З кожним кроком, кожен шматок на дошці отримує один випадковий * вибраний дійсний хід (використовуючи стандартні правила переміщення). Однак порядок переміщення штук є рандомізований на кожному кроці.
  • Шматок може захопити БУДЬ-ЯКИЙ ПІЦЕ , навіть якщо він такого ж кольору, як і король.
  • Пішаки можуть захоплювати Вперед , а також по діагоналі. Більше того, як звичайно, якщо перед ним порожній простір, пішак може перемістити два пробіли на своєму першому русі (вони також можуть захопити таким чином.) Крім того, пішаки просуваються до будь-якої випадкової частини (включаючи короля), крім пішак.
  • Переможець - останній твір, що стоїть. Однак якщо після 1000 оборотів залишилось більше одного шматка, всі решту творів є переможцями.
  • Ніяких пасажирів, чеків, замків тощо.

Вихідні дані

Після кожного повороту виводите номер повороту і як виглядає плата. Після вбиття шматка його виймають з дошки. Після першого повороту дошка може виглядати так:

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.


     R





Так гра закінчується на цьому.

* Будь ласка, переконайтеся, що вся рандомізація, проведена в цьому виклику, є рівномірною (кожна можливість має рівний шанс виникнення).


Якщо пішак може захоплювати, не рухаючись по діагоналі, чи може він рухатися також по діагоналі, не захоплюючи?
трихоплакс

1
@tri ні, це не може.
геокавель

Чи може пішак захопити дві частини одразу, коли робить подвійний хід?
orlp

1
@orlp Ні, я повинен уточнити це. Ви можете рухатись лише двома, якщо перед вами порожній простір.
geokavel

1
Також у ваших прикладах вам потрібно розрізнити пішаків як чорні або білі ( pчорно- Pбіле є стандартним у FEN ), оскільки вони рухаються в різних напрямках.
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()

Спробуйте в Інтернеті!

Збережено 18 байт завдяки Джонатану Фреху


855 байт (не повністю перевірено).
Джонатан Фрех


Я думаю, ...]+[(a+b)]*2може бути ...]+[a+b]*2або ...,a+b,a+b].
Джонатан Фрех

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

Спробуйте в Інтернеті!

Це точно можна бути golfed більше, і це виглядає як вироблення божевільного (який, я вважаю, це може бути).

Мене вражає те, як швидко випадкові рухи можуть очистити дошку (я бачив, як це роблять 15 рухів). Крім того, я думаю, що єдиний, кого я бачив, як вдарив межа 1000, - це два єпископи, які танцювали в різних кольорах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.