チェスのダービー


16

チェスや解体ダービーよりも正反対の可能性があるもの。あなたは、今日まで、一方を楽しむ人はもう一方を楽しむことはないと思うでしょう。

ルール

開始位置は、標準のチェス盤です。

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

普通のように見えますが、それがすべての最後の部分の競争であることがわかるまでは:

  • ターンごとに、ボード上の各ピースは、ランダムに選択された有効な動きを1つ行います(標準の動きルールを使用)。ただし、ピースが移動する順序は、ターンごとにランダム化されます。
  • ピースは、たとえそれが同じ色であっても、王であっても、あらゆるピースをキャプチャできます。
  • ポーンはFORWARDと対角線をキャプチャできます。さらに、通常のように、その前に空きスペースがある場合、ポーンはその最初の動きで2つのスペースを移動できます(そのようにキャプチャすることもできます)。さらに、ポーンはaポーン。
  • 勝者は最後の駒です。ただし、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





それでゲームはそこで終わります。

*このチャレンジで行われるすべてのランダム化が均一であることを確認してください(すべての可能性が等しく発生する可能性があります)。


ポーンが斜めに移動せずにキャプチャできる場合、キャプチャせずに斜めに移動できますか?
-trichoplax

1
@triいいえ、できません。
-geokavel

ポーンはダブルムーブするときに2つのピースを同時にキャプチャできますか
-orlp

1
@orlpいいえ、それを明確にする必要があります。目の前に空きスペースがある場合は、2つしか移動できません。
geokavel

1
また、あなたの例では、ポーンが異なる方向に移動するため、ポーンを黒または白として区別する必要があります(FENではp黒とP白が標準です)。
mbomb007

回答:


3

Pythonの2862の 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()

オンラインでお試しください!

Jonathan Frechのおかげで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))."
";}

オンラインでお試しください!

それは間違いなくもっとゴルフをすることができ、狂人の働きのように見えます(おそらくそうかもしれません)。

ランダムな動きがボードをどれだけ速くクリアできるかに感心しました(15の動きがそれを見たことがあります)。また、1000の制限を超えたのは、異なる色の2人の司教が踊ったことだけだったと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.