ASCII Art Chessboard

12

В этом задании вы должны нарисовать шахматную доску ниже и учесть ходы.

1. Рисование

Каждый белый квадрат имеет 5x9 пробелов.

Каждый черный квадрат имеет 5x9 колонов.

Доска окружена границей колонов.

Части 5 символов шириной и сидеть в нижнем ряду квадрата в центре.

Пешки 4 символа в ширину. Они немного смещены от центра вправо, с 3 пустыми квадратами слева и 2 пустыми квадратами справа. Они сидят на одну линию выше нижней части квадрата.

За пределами поля доски не должно быть пробелов, за исключением необязательного завершающего символа новой строки.

Доска и шахматные фигуры должны быть нарисованы точно так, как показано, за исключением того, что:

  1. Вы можете заменить :черные квадраты и границу для другого символа, и вы можете заменить @черные части другим символом (но не тем, который используется для черных квадратов).

  2. Вы можете перемещать пешки на один символ влево, если хотите.

,

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:         :::::::::         :::www:::   _+_   :::::::::         ::::::::::
:  |_|_|  :: _,,:::   (/)   :::)@(:::   )@(   :::(/):::   _,,   ::|_|_|:::
:   |@|   ::"- \~::   |@|   :::|@|:::   |@|   :::|@|:::  "- \~  :::|@|::::
:   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|::::
:  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\:::
::::::::::         :::::::::         :::::::::         :::::::::         :
:::::():::    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   :
:::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   :
::::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   ::::()::::
:    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(::::
:   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\:::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::   www   :::_+_:::         :::::::::         :
:::|_|_|::   _,,   :::(/):::   ) (   :::) (:::   (/)   :::_,,:::  |_|_|  :
::::| |:::  "- \~  :::| |:::   | |   :::| |:::   | |   ::"- \~::   | |   :
::::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :
:::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  :
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

2. Переезд

Столбцы помечены AH слева направо и от 1 до 8 снизу вверх. Пользователь должен иметь возможность ввести ход в следующей форме:

<start column><start row><space><destination column><destination row>

Например, B1 C3означает переместить коня на поле перед пешкой слона (при условии, что игра только началась).

В качестве альтернативы можно использовать систему ICCF, в которой столбцы обозначены цифрами от 1 до 8, а не от A до H. Таким образом, упомянутый выше ход коня 21 33.

Следующее изображение ( источник ) проясняет обе системы:

введите описание изображения здесь

Ход должен быть выполнен и новая доска отображается. Любой получающийся в результате захват должен происходить, когда движущийся шахматист удаляет шахматного игрока на поле назначения с доски.

Нет необходимости проверять законный ход шахмат, поскольку это было решено в других задачах: самая маленькая шахматная программа и самый маленький шахматный арбитр. Если пользователь пытается переместиться из пустого квадрата, ваша программа или функция должны игнорировать это движение. Если пользователь пытается захватить дружественную фигуру, вы можете либо проигнорировать ход, либо позволить захватить неподвижную фигуру.

Нет необходимости поддерживать пассажа или рокировку.

Вы можете предположить, что входные данные будут правильно сформированы, то есть всегда в формате, описанном выше. Письма всегда будут в одном и том же случае, вы можете решить, что это за случай.

3. Скоринг и бонусы

Это код гольф. Самый короткий код выигрывает.

Бонус -10%, если ваша программа или функция позволяет продвижение. Пользователь вводит третий ввод, на этот раз одну из следующих букв: QBR N. Это должно быть разрешено, только если ход заканчивается пешкой в ​​последнем ряду. Пешка обменивается на названную фигуру. QBRN.

Бонус -10%, если ваша программа или функция реализует специальный ход «отменить» для отмены ходов (вплоть до начала игры, если требуется). Очевидно, что любители могут делать нелегальные ходы, и они могут пожелать отменить их. Вы можете определить входные данные, которые пользователь должен дать для этого движения «отменить» (оно всегда должно быть одинаковым.) Поведение не определено, если пользователь пытается отменить после начала игры.

Сумма бонусов, т. Е. Если вы получаете оба бонуса, вы получаете -20%.

Уровень реки St
источник
Сначала вы говорите «введите ход», и для меня это означает «только 1 ход». Тогда есть бонус за отмену «до самого начала»: так что это полная серия ходов, а не только один ... уточните
edc65
@ edc65 это полная серия ходов. Смотрите в первой строке «разрешить делать ходы». Единственное, что я не указал, это условие выхода из цикла. Возможно, была идея остановиться, когда один из королей захвачен, но в существующем ответе есть бесконечный цикл, который является приемлемым согласно спецификации, как написано, поэтому я оставлю это.
Уровень Река Сент-
Форматирование на двух конях на черных квадратах не совпадает. Что правильно?
JWT
@ JWT Ничего себе, никто не заметил раньше! На этом этапе мне придется принять оба. Я вижу, вы играли в свой ответ немного больше. Прежде чем я проверю ваш ответ и изменим принятие, вы закончили?
Уровень Река St
@ steveverril Я закончил, да.
JWT

Ответы:

4

Октава, 776 688 байт

688:

  • функции, встроенные в основной цикл (обе использовались только один раз),
  • используется обозначение клетки {'foo','bar'}{i}вместо немного дольше['foo';'bar'](i,:)

Еще ни один из бонусов не реализован.


Использует систему ICCF.

В описании перемещения могут отсутствовать начальные пробелы, а поле источника и назначения должно быть разделено одним пробелом, поэтому 42 44это правильно, хотя 42 44и 42 44нет.

R=@repmat;s=[t='BFJbRJFB';R(('@    A')',1,8);t+1]';while 1q=' ';c=R(':',42,74);m=R([m=R(q,5,9) l=m+26;l m],4,4);c(2:41,2:73)=m;for i=1:8 for j=1:8 f=s(i,j);z=@(c)bitand(+f,c);if z(64)b=z(1)+1;W={') (',')@('}{b};U=43-5*j;Z=9*i-2;T=Z-2:Z;Q=Z-3:Z+1;if z(2)c(U+3,Q)={'/___\','/@@@\'}{b};a=c(U+2,T)={'| |','|@|'}{b};if z(4)c(U+1,Q)='"- \~';c(U,Z-3:Z)=' _,,';else c(U+1,T)=a;if z(8)c(U,T)='(/)';elseif z(16)||z(32)c(U,T)=W;c(U-1,T)={'_+_','www'}{1+z(32)/32};else c(U,Q)='|_|_|';end
end
else c(U+2,Z-2:Z+1)={'/__\','/@@\'}{b};c(U:U+1,Z-1:Z)=['()';')('];end;end;end;end;c
m=input(q,'s')-'0';x=m(1);y=m(2);X=m(4);Y=m(5);if s(x,y)~=q&&(s(X,Y)==q||mod(s(x,y)-s(X,Y),2))s(X,Y)=s(x,y);s(x,y)=q;end
end

Несколько неглёвая версия:

# draw an empty chessboard
function n=cb
R=@repmat;
n=R(':',42,74);
m=R([m=R(' ',5,9) m+26;m+26 m],4,4);
n(2:41,2:73)=m;
end

# function n=put(n,f,c,r) :
#
# put a chessman f on column c and row r of chessboard n,
# returning new chessboard
# chessman is described by single character defined following way
# (please excuse naming bits by value rather than position):
# bit valued  127 -     unused
# bit valued  64  -     0 = field empty, 64 = field occupied.
# bits valued 32,16,8 - 0 = rook, 8 = bishop, 16 = king, 32 = queen
# bit valued  4 -       0 = not knight 4 = knight (only checked if "other piece" bit is set)
# bit valued  2 -       0 = pawn       2 = other piece
# bit valued  1 -       0 = white      1 = black

# this gives the following chars:

# pawns   - 64      (+1)  => @ , A
# knights - 64+4+2  (+1)  => F , G
# rooks   - 64+2    (+1)  => B , C
# bishops - 64+8+2  (+1)  => J , K
# kings   - 64+16+2 (+1)  => R , S
# queens  - 64+32+2 (+1) =>  b , a
# empty space - any character with bit valued 64 unset (space char does)

function n=put(n,f,c,r)
z=@(n)bitand(f-0,n);
if z(64)
    b=z(1);
    W=') ()@('(1+3*b:3+3*b);
    R=5*r;C=9*c;
    if z(2)
            n(46-R,C-5:C-1)='/___\/@@@\'(1+5*b:5+5*b);
            a=n(45-R,C-4:C-2)='| ||@|'(1+3*b:3+3*b);
            if z(4) # knight
                    n(44-R,C-5:C-1)='"- \~';
                    n(43-R,C-5:C-2)=' _,,';
            else
                    n(44-R,C-4:C-2)=a;
                    if z(8) # bishop
                            n(43-R,C-4:C-2)='(/)';
                    elseif z(16) # king
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='_+_';
                    elseif z(32) # queen
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='www';
                    else  # rook
                            n(43-R,C-5:C-1)='|_|_|';
                    end
            end
    else
            n(45-R,C-4:C-1)='/  \/@@\'(1+4*b:4+4*b);
            n(43-R:44-R,C-3:C-2)=['()';')('];
    end
end
end

# here we can easily define the chessboard.
s=['BFJbRJFB';repmat(('@    A')',1,8);'CGKcSKGC']';
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);end;end
c

# We scan five characters. They must be positions in ICCF without leading spaces separated by single space.
while m=input('','s')-'0'
x=m(1)
y=m(2)
X=m(4)
Y=m(5)
# if the move is not allowed (capture piece of the same color or the start field is blank,
# do nothing
if s(x,y)==' ' || (s(X,Y) ~=' ' && mod(s(x,y)-s(X,Y),2)==0) continue; end;
# make the move
s(X,Y)=s(x,y);
s(x,y)=' ';
# redraw the board
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);
end end
c
end
pawel.boczarski
источник
Я запустил это на ideone.com и отобразил доску, но не смог принять ее. Он прекрасно работает на tutorialspoint.com/codingground.htm (за исключением того, что король и королева поменялись местами - любой опытный шахматист скажет вам, что это имеет значение.) Я бы дал вам дополнительно +1 за недопущение захвата дружественного часть, и еще один для достойного объяснения, если бы я мог.
Уровень Река St
@steveverrill Действительно, позиции короля и королевы поменялись местами, спасибо за указание на это. Это сейчас исправлено.
pawel.boczarski
5

Рубин, 715 +696 693 683 байта

Это довольно грязное решение, но у меня нет терпения, чтобы привести его в порядок в данный момент.

Ни один из бонусов не сделан.

Использует систему ICCF.

a,b,c=->f,x,y,p{p.map{|ln|ln.gsub(/\d/){|z|f*(z.to_i)}.tr('AB',x+y)}},Array.new(64){|i|((i%56<8?[4,2,3,5,6,3,2,4][i%56]:(i-8)%40<8?1:0)<<2)+(i<16?2:0)},':'*74
loop{puts c
b.each_slice(8).with_index{|r,y|d,*e=r.map.with_index{|v,x|a[*([[' '],[':']][(x+y)%2]+[[' ','_'],['@','@']][v&2==2?1:0]+[('9@9@9@9@9;9@4()3@4)(3@3/BB\2@9;9@3_,,3@2"- \~2@3|A|3@2/BBB\2;9@3(/)3@3|A|3@3|A|3@2/BBB\2;9@2|_|_|2@3|A|3@3|A|3@2/BBB\2;3www3@3)A(3@3|A|3@3|A|3@2/BBB\2;3_+_3@3)A(3@3|A|3@3|A|3@2/BBB\2'.split(';').map{|s|s.split '@'})[v>>2]])]}
d.zip(*e).each{|r|puts ":#{r.join}:"}}
puts c
gets.scan(/(.)(.) (.)(.)/){|f,g,h,i|j,k=63+(f.to_i)-(g.to_i)*8,63+(h.to_i)-(i.to_i)*8
b[k],b[j]=b[j]>0?b[j]: b[k],0}}
JWT
источник
Отлично, кажется, работает отлично!
Уровень Река Сен
@LevelRiverSt Похоже, этот ответ короче, чем принятый в настоящее время.
Эрик Outgolfer
3

Python, 1136 890 753 байта

Извиняюсь за частичный ответ, но я новичок и мне очень понравилось это испытание. Я знаю, что это, вероятно, очень многословно, но вот мой черновик:

y=':'*9
z=' '*9
b='::/___\::'
c=':::|@|:::'
d=':::)@(:::'

ps = {'r': [y,'::|*|*|::', c, c,b],'n': [y,':::,,::::', '::"- \~::', c,b],'b': [y,':::(/):::',c,c,b],'k': [':::www:::',d,c,c,b],'q': [':::*+*:::',d,c,c,b],'p': [y, '::::():::','::::)(:::',':::/__\::',y]}

def cell(p,c):
  if p == '!':
    return ([z]*5,[y]*5)[c]
  s = []
  for l in ps[p.lower()]:
    l = (l.replace('@', ' '), l.replace('_', '@'))[p.islower()]
    l = (l.replace(':', ' '), l)[c].replace('*', '_')
    s.append(l)
  return s


b = {8:'rnbkqbnr',7:'p'*8,2:'P'*8}
b[1] = b[8].upper()
for i in range(3,7):
  b[i] = '!'*8

o=[y*8]
c=0
for r in b:
  l=['']*5
  for p in b[r]:
    cc=cell(p,c)
    for i in range(0,5):
      l[i]+=cc[i]
    c=not c
  o.extend(l)
  c=not c
o.append(o[0])
for l in o:
  print ':'+l+':'
terribleuser
источник
Спасибо за ответ. Это наш обычай включать в ответы строку заголовка с указанием языка и количества байтов. Какой это язык? Это похоже на питона, но я не могу заставить его работать на ideone.com
Level River St
1
Удалите все пробелы вокруг =, и если у a forили a есть ifтолько одна строка внутри, все они могут идти по одной и той же строке. Взгляните на Советы по игре в гольф на Python .
mbomb007