Satranç-olition Derby


16

Satranç ve yıkım derbisinden daha kutupsal karşıtlar ne olabilir ? Birinden hoşlanan hiç kimsenin diğerinden hoşlanmayacağını düşünürdünüz ... bugüne kadar.

kurallar

Başlangıç ​​pozisyonu standart bir satranç tahtasıdır:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

KENDİ, SON PARÇA DAİMİ yarışması için HER BİR PARÇA bulana kadar yeterince normal görünüyor :

  • Her dönüşte, tahtadaki her parça bir rastgele * seçilmiş geçerli hamle yapar (standart hamle kurallarını kullanarak). Ancak, parçaların hareket sırası her turda rastgele seçilir.
  • Bir parça, bir kralla bile aynı renkte olsa bile HERHANGİ BİR PARÇA yakalayabilir .
  • Piyonlar yakalayabilir İLERİYE DOĞRU diyagonal yanı sıra. Dahası, normal gibi, önünde boş bir alan varsa, bir piyon ilk hareketinde iki alanı hareket ettirebilir (bu şekilde de yakalayabilirler.) Dahası, piyonlar, piyon.
  • Kazanan son duran parça. Ancak 1000 turdan sonra birden fazla parça kaldıysa, kalan tüm parçalar kazanır.
  • Yolcu, Çek, Kale vb. Yok.

Çıktı

Her dönüşten sonra dönüş numarasını ve kartın nasıl göründüğünü çıktı. Bir parça öldürüldükten sonra tahtadan çıkarılır. İlk dönüşten sonra, tahta şöyle görünebilir:

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

1000 hamleden sonra tahta şöyle görünebilir:

1000.
  Q  K


P  N R

 R  B N   

  Q

Ve oyun bitiyor.

Veya 556 dönüşten sonra tahta şöyle görünür:

556.


     R,





Oyun burada bitiyor.

* Lütfen bu meydan okumada yapılan tüm randomizasyonların aynı olduğundan emin olun (her olasılığın eşit olma şansı vardır).


Bir piyon çapraz hareket etmeden yakalayabilirse, yakalamadan da çapraz hareket edebilir mi?
16:10

1
@tri hayır, cant.
geokavel

Bir piyon, çift hareket ettiğinde aynı anda iki parçayı yakalayabilir mi?
orlp

1
@orlp Hayır, bunu açıklığa kavuşturmalıyım. Önünüzde boş bir alan varsa yalnızca iki tane hareket ettirebilirsiniz.
geokavel

1
Ayrıca, örneklerinizde, piyonları siyah veya beyaz olarak ayırmanız gerekir ( psiyah ve Pbeyaz FEN'de standarttır ), çünkü farklı yönleri taşırlar.
mbomb007

Yanıtlar:


3

Python 2 , 862 846 844 bayt

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

Çevrimiçi deneyin!

Jonathan Frech sayesinde 18 bayt kurtardı


855 bayt (tam olarak test edilmemiştir).
Jonathan Frech


Bence ...]+[(a+b)]*2ya ...]+[a+b]*2ya olabilir ...,a+b,a+b].
Jonathan Frech

0

PHP, 1849 bayt

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

Çevrimiçi deneyin!

Bu olabilir kesinlikle daha golfed edilmesi ve biraz (Ben, bu olabilir varsayalım,) bir deli çalışmalarına benziyor.

Rastgele hamlelerin tahtayı ne kadar hızlı temizleyebileceğinden çok etkilendim (15 hamle yaptığını gördüm). Ayrıca, 1000 sınırına ulaştığım tek kişinin dans eden farklı renkler üzerinde iki piskopos olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.