Szachownica artystyczna ASCII

12

W tym wyzwaniu musisz narysować szachownicę poniżej i pozwolić na wykonanie ruchów.

1. Rysunek

Każdy biały kwadrat ma 5 x 9 pól.

Każdy czarny kwadrat ma 5 x 9 dwukropków.

Plansza jest otoczona granicą dwukropków.

Elementy mają szerokość 5 znaków i siedzą w dolnym rzędzie kwadratu pośrodku.

Pionki mają szerokość 4 znaków. Siedzą nieco poza środkiem po prawej stronie, z 3 pustymi kwadratami po lewej i 2 pustymi kwadratami po prawej. Siedzą jedną linię nad dolną częścią kwadratu.

Nie będzie białych znaków poza obszarem planszy, z wyjątkiem opcjonalnego końcowego znaku nowej linii.

Planszę i szachy losuje się dokładnie tak, jak pokazano, z tym wyjątkiem, że:

  1. Możesz :zastąpić czarne kwadraty i obramowanie innym symbolem, a czarne czarne kwadraty zastąpić @innym symbolem (ale nie tym samym, co czarny kwadraty).

  2. Jeśli chcesz, możesz przesunąć pionki o jedną postać w lewo.

.

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

2. Przeprowadzka

Kolumny są oznaczone AH od lewej do prawej i od 1 do 8 od dołu do góry. Użytkownik powinien mieć możliwość wprowadzenia przeniesienia w następującej formie:

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

Na przykład B1 C3oznacza przesunięcie rycerza na pole przed pionkiem biskupa (zakładając, że gra się właśnie rozpoczęła).

Alternatywnie można zastosować system ICCF, w którym kolumny są oznaczone od 1 do 8 zamiast od A do H. Tak więc staje się wspomniany wyżej ruch rycerza 21 33.

Poniższy obraz ( źródło ) wyjaśnia oba systemy:

wprowadź opis zdjęcia tutaj

Ruch zostanie wykonany, a nowa tablica wyświetlona. Wszelkie wynikające z tego schwytanie ma miejsce, gdy poruszający się szachista usunie figurę z pola docelowego z planszy.

Nie ma potrzeby sprawdzania legalnego ruchu szachowego, ponieważ został on omówiony w innych wyzwaniach: Najmniejszy program szachowy i Najmniejszy arbiter szachowy Jeśli użytkownik spróbuje przejść z pustego pola, Twój program lub funkcja powinny zignorować ruch. Jeśli użytkownik próbuje schwytać przyjazny element, możesz zignorować ruch lub zezwolić na uchwycenie nieruchomego elementu.

Nie ma potrzeby wspierania en passant ani castlingu.

Możesz założyć, że dane wejściowe będą dobrze uformowane, tj. Zawsze w formacie opisanym powyżej. Listy zawsze będą w tym samym przypadku, możesz zdecydować, który to przypadek.

3. Punktacja i bonusy

To jest kod golfowy. Najkrótszy kod wygrywa.

-10% premii, jeśli twój program lub funkcja pozwala na promocję. Użytkownik wprowadza trzecie wejście, tym razem jedną z następujących liter: QBR N. To powinno być dozwolone tylko wtedy, gdy ruch kończy się pionkiem w ostatnim rzędzie. Pion jest wymieniany na wskazany element. QBRN.

-10% premii, jeśli twój program lub funkcja realizuje specjalny ruch „cofnij” w celu odwrócenia ruchów (w razie potrzeby cofnij się na początek gry). Oczywiście amatorzy mogą wykonywać nielegalne ruchy i mogą chcieć aby je cofnąć. Możesz zdefiniować dane wejściowe, które użytkownik musi podać, aby wykonać ruch „cofnij” (zawsze musi być taki sam). Zachowanie jest niezdefiniowane, jeśli użytkownik spróbuje cofnąć go poza początkiem gry.

Suma bonusów, tzn. Jeśli wybierzesz oba bonusy, otrzymasz -20%.

Level River St
źródło
Na początku mówisz „wprowadź ruch”, a dla mnie oznacza to „tylko 1 ruch”. Następnie jest premia za cofanie „aż do początku”: więc jest to kompletna seria ruchów, a nie tylko jeden ... proszę wyjaśnić
edc65
@ edc65 to pełna seria ruchów. Zobacz pierwszy wiersz „zezwól na wykonywanie ruchów”. Jedyną rzeczą, której nie określiłem, jest warunek wyjścia dla pętli. Pomysłem może być zatrzymanie, gdy jeden z królów zostanie schwytany, ale istniejąca odpowiedź ma nieskończoną pętlę, co jest dopuszczalne zgodnie ze specyfikacją, jak napisano, więc zostawię ją.
Level River St
Formatowanie dwóch rycerzy na czarnych kwadratach nie pasuje. Który jest poprawny?
JWT
@ JWT wow, nikt wcześniej tego nie zauważył! Na tym etapie będę musiał zaakceptować oba. Widzę, że trochę bardziej grałeś w swoją grę. Zanim przetestuję twoją odpowiedź i zmienię akceptację, czy skończyłeś?
Level River St
@ steveverril Skończyłem, tak.
JWT,

Odpowiedzi:

4

Oktawa, 776 688 bajtów

688:

  • funkcje wbudowane w główną pętlę (obie były używane tylko raz),
  • używana notacja komórkowa {'foo','bar'}{i}zamiast nieco dłuższej['foo';'bar'](i,:)

Nadal żaden z wdrożonych bonusów.


Korzysta z systemu ICCF.

Nie może być żadnych spacje w opisie ruchu i pole źródłowy i docelowy muszą być oddzielone pojedynczym spacji, więc 42 44jest prawidłowa, natomiast 42 44i 42 44nie są.

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

Nieco golfowa wersja:

# 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
źródło
Uruchomiłem to na ideone.com i wyświetliłem tablicę, ale nie mogłem jej zaakceptować. Działa świetnie na tutorialspoint.com/codingground.htm (z wyjątkiem odwrócenia króla i królowej - każdy wytrawny szachista powie ci, że to robi różnicę). Dałbym ci dodatkową +1 za niedozwolenie na schwytanie przyjaznego kawałek i jeszcze jedno za dobre wytłumaczenie, gdybym mógł.
Level River St
@steveverrill Rzeczywiście, pozycje króla i królowej zostały odwrócone, dzięki za zwrócenie na to uwagi. Teraz jest naprawione.
pawel.boczarski
5

Rubin, 715 696 693 683 bajty

Jest to dość niechlujne rozwiązanie, ale w tej chwili nie mam cierpliwości, aby go dalej sprzątać.

Żadna z premii nie została wykonana.

Korzysta z systemu 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
źródło
Doskonale, wydaje się działać idealnie!
Level River St
@LevelRiverSt Wygląda na to, że ta odpowiedź jest krótsza niż obecnie akceptowana.
Erik the Outgolfer
3

Python, 1136 890 753 bajtów

Przepraszamy za częściową odpowiedź, ale jestem nowicjuszem i naprawdę podobało mi się to wyzwanie. Wiem, że to chyba bardzo gadatliwe, ale oto mój wstępny szkic:

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+':'
straszny użytkownik
źródło
Dziękuję za odpowiedź. Naszym zwyczajem jest dołączanie wiersza tytułu do odpowiedzi wraz z językiem i liczbą bajtów. Jaki to język? Wygląda jak python, ale nie mogę go uruchomić na ideone.com
Level River St
1
Usuń wszystkie spacje wokół =, a jeśli a forlub iftylko ma jedną linię w środku, wszystko może przejść do tej samej linii. Spójrz na Wskazówki dotyczące gry w golfa w Pythonie .
mbomb007,