Derby Catur-olisi

16

Apa yang bisa lebih berlawanan kutub dari catur dan penghancuran derby . Anda akan berpikir bahwa tidak seorang pun yang menikmati satu akan menikmati yang lain ... sampai hari ini.

Aturan

Posisi awal adalah papan catur standar:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Terlihat cukup normal, sampai Anda mengetahui bahwa ini adalah SETIAP PIECE UNTUK YANG SENDIRI, kompetisi STANDING PIECE TERAKHIR :

  • Pada setiap belokan, setiap bagian di papan tulis dapat membuat satu gerakan valid yang dipilih secara acak * (menggunakan aturan langkah standarnya). Namun, urutan potongan bergerak secara acak setiap belokan.
  • Sepotong dapat menangkap SETIAP BAGIAN , bahkan jika itu warna yang sama seperti itu, bahkan seorang raja.
  • Pion dapat menangkap FORWARD , serta diagonal. Selain itu, seperti biasa, jika ada ruang kosong di depannya, pion dapat memindahkan dua ruang pada langkah pertama (mereka juga dapat menangkap dengan cara itu.) Selanjutnya, pion mempromosikan ke setiap bagian acak (termasuk raja) selain dari menggadaikan.
  • Pemenangnya adalah yang terakhir. Namun jika setelah 1000 putaran , ada lebih dari satu bagian yang tersisa, semua bagian yang tersisa adalah pemenang.
  • Tidak Ada Passant, Cek, Kastil, dll.

Keluaran

Setelah setiap belokan menghasilkan nomor belokan, dan seperti apa bentuk papannya. Setelah sepotong terbunuh, ia dikeluarkan dari papan. Setelah belokan pertama, papan akan terlihat seperti ini:

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

Setelah 1000 gerakan, papan akan terlihat seperti ini:

1000.
  Q  K


P  N R

 R  B N   

  Q

Dan permainan berakhir.

Atau Mungkin setelah 556 putaran papan terlihat seperti ini:

556.


     R





Jadi permainan berakhir di sana.

* Pastikan semua pengacakan yang dilakukan dalam tantangan ini seragam (setiap kemungkinan memiliki peluang yang sama untuk terjadi).

geokavel
sumber
Jika pion dapat menangkap tanpa bergerak secara diagonal, dapatkah itu juga bergerak secara diagonal tanpa menangkap?
trichoplax
1
@tri tidak, tidak bisa.
geokavel
Bisakah pion menangkap dua potong sekaligus ketika ia bergerak ganda?
orlp
1
@ Atau Tidak, saya harus mengklarifikasi itu. Anda hanya dapat memindahkan dua, jika ada ruang kosong di depan Anda.
geokavel
1
Juga, dalam contoh Anda, Anda perlu membedakan pion sebagai hitam atau putih ( phitam dan Pputih adalah standar dalam FEN ), karena pion bergerak dengan arah yang berbeda.
mbomb007

Jawaban:

3

Python 2 , 862 846 844 byte

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

Cobalah online!

Disimpan 18 byte berkat Jonathan Frech

TFeld
sumber
855 byte (tidak sepenuhnya diuji).
Jonathan Frech
847 byte .
Jonathan Frech
Saya pikir ...]+[(a+b)]*2dapat berupa ...]+[a+b]*2atau ...,a+b,a+b].
Jonathan Frech
0

PHP, 1849 byte

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

Cobalah online!

Hal ini dapat pasti akan golfed lebih, dan itu terlihat seperti cara kerja orang gila (yang, saya kira, mungkin).

Saya terkesan pada seberapa cepat gerakan acak dapat membersihkan papan (saya telah melihat 15 gerakan melakukannya). Juga, saya pikir satu-satunya yang saya lihat mencapai batas 1000 adalah dua uskup dengan berbagai warna menari.

Jo.
sumber