Шахматная олимпиада Дерби


16

Что может быть более полярным, чем шахматы и дерби сноса . Вы могли бы подумать, что никто, кто наслаждается одним, не будет наслаждаться другим ... до сегодняшнего дня.

правила

Исходная позиция - стандартная шахматная доска:

RNBQKBNR
PPPPPPPP 





PPPPPPPP 
RNBQKBNR

Выглядит нормально, пока вы не узнаете, что это КАЖДАЯ ЧАСТЬ ДЛЯ СЕБЯ, ПОСЛЕДНЯЯ ЧАСТЬ ПОСТОЯННОГО соревнования:

  • На каждом ходу каждая фигура на доске делает один случайный * выбранный действительный ход (используя свои стандартные правила хода). Однако порядок перемещения фигур рандомизируется каждый ход.
  • Часть может захватить ЛЮБУЮ ЧАСТЬ , даже если она того же цвета, что и она, даже король.
  • Пешки могут захватывать как вперёд , так и по диагонали. Более того, как обычно, если перед ней пустое пространство, пешка может переместиться на два пробела в своем первом движении (они также могут захватить этот путь). Кроме того, пешки превращаются в любую случайную фигуру (включая короля), кроме пешки.
  • Победителем является последний стоящий кусок. Однако, если после 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.


     р





Так что игра заканчивается там.

* Пожалуйста, убедитесь, что все рандомизации, выполненные в этой задаче, одинаковы (каждая возможность имеет одинаковую вероятность возникновения).


Если пешка может захватывать, не двигаясь по диагонали, может ли она двигаться по диагонали без захвата?
Трихоплакс

1
@ три нет, не могу.
геокавель

Может ли пешка захватить две фигуры одновременно, когда она делает двойной ход?
orlp

1
@ orlp Нет, я должен уточнить это. Вы можете двигаться только два, если перед вами пустое место.
геокавель

1
Кроме того, в ваших примерах вы должны различать пешки как черные или белые ( pчерно- Pбелое является стандартным в FEN ), потому что они перемещаются в разных направлениях.
mbomb007

Ответы:


3

Python 2 , 862 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()

Попробуйте онлайн!

Сохранено 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, было два слона, танцующих разные цвета.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.