ASCII Art Chessboard


12

У цьому виклику ви повинні намалювати шахівницю внизу та дозволити робити ходи.

1. Малювання

Кожен білий квадрат має 5х9 пробілів.

Кожен чорний квадрат має 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%.


Спочатку ви говорите «введіть хід», а для мене це означає «всього 1 хід». Тоді є бонус за скасування "до початку": тож це повна серія рухів, а не лише одна ... уточніть, будь ласка,
edc65

@ edc65 - це повна серія кроків. Дивіться перший рядок "дозволяти робити ходи". Єдине, що я не вказав - це умова виходу для циклу. Можливо, була ідея зупинитись, коли хтось із царів потрапив у полон, але існуюча відповідь має нескінченний цикл, який прийнятний за специфікацією, як написано, тому я залишу його.
Рівень р. Св.

Форматування двох лицарів на чорних квадратах не відповідає. Що правильно?
JWT

@JWT вау, ніхто раніше не помічав! На цьому етапі мені доведеться прийняти обоє. Я бачу, ви трохи більше відповіли на свою відповідь. Перш ніж перевірити вашу відповідь і змінити прийняття, ви закінчили?
Рівень р. Св.

@ 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

Я запустив це на ideone.com і показав дошку, але не зміг прийняти будь-яку інформацію. Це чудово працює на tutorialspoint.com/codingground.htm (за винятком того, що у вас король і королева перевернуті - будь-який досвідчений шахіст скаже вам, що це має значення.) Я дав би вам додатковий +1 за те, що не дозволяєте захоплювати дружнє товариство шматок, і ще одне на гідне пояснення, якщо я міг.
Рівень річки Св.

@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}}

Відмінно, здається, працює чудово!
Рівень Рівер Сент

@LevelRiverSt Схоже, що ця відповідь коротша від прийнятої.
Ерік Аутгольфер

3

Пітон, 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+':'

Дякую за відповідь. Ми звичайно включати заголовок у відповіді з мовою та кількістю байтів. Яка мова це? Це схоже на python, але я не можу змусити його працювати на ideone.com
Level River St

1
Видаліть усі пробіли навколо =, і якщо у одного forабо ifлише одного рядка всередині нього, всі вони можуть перейти на ту саму лінію. Ознайомтеся з порадами для гольфу в Python .
mbomb007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.