ASCII Art Schachbrett

12

Bei dieser Herausforderung musst du das Schachbrett unten zeichnen und Züge zulassen.

1. Zeichnen

Jedes weiße Quadrat hat 5x9 Felder.

Jedes schwarze Quadrat hat 5x9 Doppelpunkte.

Das Brett ist von einem Rand aus Doppelpunkten umgeben.

Die Teile sind 5 Zeichen breit und befinden sich in der unteren Reihe des Quadrats in der Mitte.

Die Bauern sind 4 Zeichen breit. Sie sitzen etwas außerhalb der Mitte rechts, mit 3 leeren Quadraten links und 2 leeren Quadraten rechts. Sie sitzen eine Zeile über dem unteren Rand des Platzes.

Außerhalb des Bereichs der Tafel darf kein Leerzeichen vorhanden sein, mit Ausnahme einer optionalen nachgestellten Newline.

Das Brett und die Schachfiguren sind genau wie gezeigt zu zeichnen, außer dass:

  1. Sie können :die schwarzen Quadrate und den Rand durch ein anderes Symbol ersetzen @und die schwarzen Teile durch ein anderes Symbol ersetzen (jedoch nicht das gleiche Symbol, das für die schwarzen Quadrate verwendet wird).

  2. Wenn Sie möchten, können Sie die Bauern um einen Charakter nach links verschieben.

.

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

2. Bewegen

Die Spalten sind von links nach rechts mit AH und von unten nach oben mit 1 bis 8 gekennzeichnet. Der Benutzer muss in der Lage sein, einen Zug in folgender Form einzugeben:

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

Zum Beispiel B1 C3bedeutet, den Ritter auf das Feld vor dem Bauern des Bischofs zu bewegen (vorausgesetzt, das Spiel hat gerade erst begonnen).

Alternativ kann das ICCF-System verwendet werden, bei dem die Spalten mit 1 bis 8 anstelle von A bis H gekennzeichnet sind. So wird der oben erwähnte Ritterzug 21 33.

Das folgende Bild ( Quelle ) verdeutlicht beide Systeme:

Geben Sie hier die Bildbeschreibung ein

Der Zug soll ausgeführt und die neue Tafel angezeigt werden. Jede resultierende Erfassung muss erfolgen, indem der sich bewegende Schachspieler den Schachspieler auf dem Zielfeld vom Brett entfernt.

Es ist nicht erforderlich, nach einem legalen Schachzug zu suchen, da dies in anderen Herausforderungen behandelt wurde: Kleinstes Schachprogramm und kleinster Schachschiedsrichter Wenn der Benutzer versucht, sich von einem leeren Feld zu bewegen, sollte Ihr Programm oder Ihre Funktion den Zug ignorieren. Wenn der Benutzer versucht, ein freundliches Teil zu erfassen, können Sie entweder die Bewegung ignorieren oder zulassen, dass das stationäre Teil erfasst wird.

Es besteht keine Notwendigkeit, en passant oder Rochade zu unterstützen.

Sie können davon ausgehen, dass die Eingabe gut geformt ist, dh immer in dem oben beschriebenen Format. Briefe werden immer im selben Fall sein, Sie können entscheiden, welcher Fall das ist.

3. Wertung und Boni

Das ist Code Golf. Der kürzeste Code gewinnt.

-10% Bonus, wenn Ihr Programm oder Ihre Funktion Werbung ermöglicht. Der Benutzer gibt eine dritte Eingabe ein, diesmal einen der folgenden Buchstaben: QBR N. Dies sollte nur zulässig sein, wenn der Zug mit einem Bauern in der letzten Zeile endet. Der Bauer wird gegen das genannte Stück ausgetauscht. QBRN.

-10% Bonus, wenn Ihr Programm oder Ihre Funktion einen speziellen "Rückgängig" -Zug für die Umkehrung von Zügen implementiert (ggf. bis zum Beginn des Spiels). Offensichtlich können Amateurspieler illegale Züge ausführen, und sie möchten dies möglicherweise um sie rückgängig zu machen. Sie können die Eingabe definieren, die der Benutzer für diesen "Rückgängig" -Zug geben muss (sie muss immer gleich sein). Das Verhalten ist undefiniert, wenn der Benutzer versucht, über den Beginn des Spiels hinaus rückgängig zu machen.

Die Bonussumme, dh wenn Sie sich für beide Boni entscheiden, erhalten Sie -20%.

Level River St.
quelle
Zuerst sagst du "einen Zug eingeben" und für mich bedeutet es "nur 1 Zug". Dann gibt es den Bonus für das Rückgängigmachen "bis zum Anfang": Es ist also eine komplette Serie von Zügen, nicht nur einer ... bitte klären
edc65
@ edc65 es ist eine komplette Reihe von Zügen. Siehe die erste Zeile "Zugriffe zulassen". Das einzige, was ich nicht angegeben habe, ist die Ausgangsbedingung für die Schleife. Es könnte eine Idee gewesen sein, aufzuhören, wenn einer der Könige gefangen genommen wird, aber die vorhandene Antwort hat eine Endlosschleife, die unter der angegebenen Spezifikation akzeptabel ist, also lasse ich sie.
Level River St
Die Formatierung der beiden Ritter auf schwarzen Quadraten stimmt nicht überein. Welches ist richtig?
JWT
@JWT wow, das hat noch niemand bemerkt! In diesem Stadium muss ich beide akzeptieren. Ich sehe, du hast deine Antwort ein bisschen mehr gespielt. Haben Sie fertig, bevor ich Ihre Antwort teste und die Annahme ändere?
Level River St
@ steveverril Ich bin fertig, ja.
JWT

Antworten:

4

Oktave, 776 688 Bytes

688:

  • Funktionen in der Hauptschleife (beide wurden nur einmal verwendet),
  • verwendete Zellnotation {'foo','bar'}{i}anstelle von etwas länger['foo';'bar'](i,:)

Immer noch keiner der Boni implementiert.


Verwendet das ICCF-System.

Es dürfen keine führenden Leerzeichen in der Bewegung Beschreibung und die Quell- und Zielfeld durch einen einzelnen Leerzeichen getrennt werden müssen, so 42 44richtig ist, während 42 44und 42 44sind es nicht.

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

Etwas ungolfed Version:

# 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
quelle
Ich habe dies auf ideone.com ausgeführt und das Board angezeigt, konnte es jedoch nicht dazu bringen, Eingaben zu akzeptieren. Es funktioniert hervorragend unter tutorialspoint.com/codingground.htm (außer Sie haben den König und die Königin vertauscht - jeder erfahrene Schachspieler wird Ihnen sagen, dass es einen Unterschied macht.) Ich würde Ihnen eine zusätzliche +1 geben, wenn Sie nicht zulassen, dass ein Freund gefangen genommen wird Stück, und noch eines für die anständige Erklärung, wenn ich könnte.
Level River St
@steveverrill In der Tat wurden die Positionen von König und Königin umgekehrt, danke, dass Sie darauf hingewiesen haben. Es ist jetzt behoben.
pawel.boczarski
5

Rubin, 715 696 693 683 Bytes

Dies ist eine ziemlich unordentliche Lösung, aber ich habe im Moment nicht die Geduld, sie weiter aufzuräumen.

Keiner der Boni gemacht.

Verwendet das ICCF-System.

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
quelle
Ausgezeichnet, scheint perfekt zu funktionieren!
Level River St
@LevelRiverSt Diese Antwort scheint kürzer zu sein als die derzeit akzeptierte.
Erik der Outgolfer
3

Python, 1136 890 753 Bytes

Entschuldigung für die teilweise Antwort, aber ich bin ein Neuling und ich habe diese Herausforderung wirklich genossen. Ich weiß, dass es wahrscheinlich sehr ausführlich ist, aber hier ist mein grober Entwurf:

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+':'
schrecklicher Benutzer
quelle
Danke für die Antwort. Es ist unsere Gewohnheit, den Antworten eine Titelzeile mit der Sprache und der Anzahl der Bytes hinzuzufügen. Welche Sprache ist das? Es sieht aus wie Python, aber ich kann es nicht auf ideone.com zum Laufen bringen
Level River St
1
Entfernen Sie alle Leerzeichen =, und wenn ein foroder ein ifnur eine Zeile enthält, kann alles auf derselben Zeile stehen. Schauen Sie sich Tipps zum Golfen in Python an .
mbomb007