Derby szachowe

16

Co może być bardziej biegunowymi przeciwieństwami niż szachy i derby rozbiórkowe . Można by pomyśleć, że nikt, kto lubi jedną, nie będzie się podobał ... aż do dzisiaj.

Zasady

Pozycja początkowa to standardowa szachownica:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Wygląda wystarczająco normalnie, dopóki nie dowiesz się, że jest to KAŻDY STAWKA DLA SIEBIE, OSTATNI STOJĄCY STAWKA :

  • W każdej turze każdy pionek na planszy wykonuje jeden losowo wybrany * prawidłowy ruch (używając standardowych zasad ruchu). Jednak kolejność poruszania się elementów jest losowa co turę.
  • Kawałek może uchwycić KAŻDĄ SZTUKĘ , nawet jeśli jest tego samego koloru, nawet króla.
  • Pionki mogą zdobywać DO PRZODU , a także po przekątnej. Ponadto, jak zwykle, jeśli przed nim jest pusta przestrzeń, pionek może poruszyć się o dwa pola w swoim pierwszym ruchu (mogą również przejąć w ten sposób.) Ponadto pionki awansują na dowolny losowy element (w tym króla) inny niż pionek.
  • Zwycięzcą jest ostatni stojący kawałek. Jednak jeśli później 1000 turach pozostanie więcej niż jeden element, wszystkie pozostałe elementy zostaną zwycięzcami.
  • Bez pasywów, czeków, zamków itp.

Wynik

Po każdej turze wypływa numer tury i jak wygląda plansza. Po zabiciu pionka jest on usuwany z planszy. Po pierwszej turze plansza może wyglądać następująco:

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

Po 1000 ruchach plansza może wyglądać następująco:

1000.
  Q  K


P  N R

 R  B N   

  Q

I gra się kończy.

A może po 556 turach tablica wygląda tak:

556


     R





Gra się kończy.

* Upewnij się, że wszystkie losowania wykonane w tym wyzwaniu są jednolite (każda szansa ma jednakową szansę).

geokavel
źródło
Jeśli pionek może schwytać bez ruchu po przekątnej, to czy może również poruszać się po przekątnej bez chwytania?
trichoplax
1
@ tri nie, nie mogę.
geokavel
Czy pionek może uchwycić dwa elementy jednocześnie, gdy wykona podwójny ruch?
orlp
1
@orlp Nie, powinienem to wyjaśnić. Możesz przenieść tylko dwa, jeśli przed tobą jest puste miejsce.
geokavel
1
Ponadto w twoich przykładach musisz rozróżnić pionki jako czarne lub białe ( pczarno- Pbiały jest standardem w FEN ), ponieważ poruszają się one w różnych kierunkach.
mbomb007

Odpowiedzi:

3

Python 2 , 862 846 844 bajtów

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

Wypróbuj online!

Zaoszczędź 18 bajtów dzięki Jonathanowi Frechowi

TFeld
źródło
855 bajtów (nie w pełni przetestowane).
Jonathan Frech
847 bajtów .
Jonathan Frech
Myślę, że ...]+[(a+b)]*2może być ...]+[a+b]*2albo ...,a+b,a+b].
Jonathan Frech
0

PHP, 1849 bajtów

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

Wypróbuj online!

Zdecydowanie może być grałem więcej, i wygląda trochę jak wyrobiskach szaleniec (który, jak sądzę, może być).

Jestem pod wrażeniem tego, jak szybko losowe ruchy mogą wyczyścić planszę (widziałem 15 ruchów, które to robią). Myślę też, że jedynym, który widziałem, gdy przekroczyłem limit 1000, byli dwaj biskupi tańczący w różnych kolorach.

Jo.
źródło