Derby de ollas de ajedrez

16

Lo que podría ser más opuestos polares que el ajedrez y el derby de demolición . Uno pensaría que nadie que disfruta uno disfrutaría del otro ... hasta hoy.

Reglas

La posición inicial es un tablero de ajedrez estándar:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Parece lo suficientemente normal, hasta que descubres que es CADA PIEZA PARA MISMO, LA ÚLTIMA PIEZA competencia:

  • En cada turno, cada pieza del tablero puede hacer un movimiento válido seleccionado aleatoriamente * (usando sus reglas de movimiento estándar). Sin embargo, el orden en que se mueven las piezas se aleatoriza cada turno.
  • Una pieza puede capturar CUALQUIER PIEZA , incluso si es del mismo color, incluso un rey.
  • Los peones pueden capturar HACIA ADELANTE , así como en diagonal. Además, como es normal, si hay un espacio vacío frente a él, un peón puede mover dos espacios en su primer movimiento (también pueden capturar de esa manera). Además, los peones ascienden a cualquier pieza aleatoria (incluido el rey) que no sea un empeñar.
  • El ganador es la última pieza en pie. Sin embargo, si después de 1000 turnos , queda más de una pieza, todas las piezas restantes son ganadoras.
  • No En Passants, Cheques, Castillos, etc.

Salida

Después de cada turno, muestra el número de turno y el aspecto del tablero. Después de matar una pieza, se retira del tablero. Después del primer turno, el tablero puede verse así:

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

Después de 1000 movimientos, el tablero puede verse así:

1000.
  Q  K


P  N R

 R  B N   

  Q

Y el juego termina.

O tal vez después de 556 vueltas el tablero se vea así:

556.


     R





Entonces el juego termina ahí.

* Asegúrese de que toda la aleatorización realizada en este desafío sea uniforme (todas las posibilidades tienen la misma probabilidad de ocurrir).

geokavel
fuente
Si un peón puede capturar sin moverse en diagonal, ¿también puede moverse en diagonal sin capturar?
trichoplax
1
@tri no, no puede.
geokavel
¿Puede un peón capturar dos piezas a la vez cuando realiza un doble movimiento?
orlp
1
@orlp No, debería aclarar eso. Solo puedes mover dos, si hay un espacio vacío frente a ti.
geokavel
1
Además, en sus ejemplos, debe distinguir los peones como negros o blancos ( pblanco y Pnegro es estándar en FEN ), porque se mueven en direcciones diferentes.
mbomb007

Respuestas:

3

Python 2 , 862 846 844 bytes

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()

Pruébalo en línea!

Guardado 18 bytes gracias a Jonathan Frech

TFeld
fuente
855 bytes (no completamente probado).
Jonathan Frech
847 bytes .
Jonathan Frech
Creo que ...]+[(a+b)]*2puede ser cualquiera ...]+[a+b]*2o ...,a+b,a+b].
Jonathan Frech
0

PHP, 1849 bytes

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

Pruébalo en línea!

Puede sin duda ser golfed más, y se ve algo así como el funcionamiento de un loco (que, supongo, que sea).

Estoy impresionado de lo rápido que los movimientos aleatorios pueden despejar el tablero (he visto 15 movimientos hacerlo). Además, creo que el único que vi alcanzar el límite de 1000 fue dos obispos bailando en diferentes colores.

Jo
fuente