Échiquier d'art ASCII

12

Dans ce défi, vous devez dessiner l'échiquier ci-dessous et autoriser les mouvements.

1. Dessin

Chaque carré blanc a 5x9 espaces.

Chaque carré noir a 5 x 9 colons.

La planche est entourée d'une bordure de deux points.

Les pièces ont 5 caractères de large et se trouvent sur la rangée inférieure du carré au centre.

Les pions ont 4 caractères de large. Ils sont légèrement décalés du centre à droite, avec 3 carrés vides à gauche et 2 carrés vides à droite. Ils sont assis une ligne au-dessus du bas du carré.

Il ne doit pas y avoir d'espace en dehors de la zone du tableau, à l'exception d'une nouvelle ligne facultative.

Le tableau et les échecs doivent être tirés exactement comme indiqué, sauf que:

  1. Vous pouvez remplacer le :dans les carrés noirs et la bordure par un symbole différent, et vous pouvez remplacer le @dans les morceaux noirs par un symbole différent (mais pas le même que celui utilisé pour les carrés noirs).

  2. Vous pouvez déplacer les pions d'un caractère vers la gauche si vous le souhaitez.

.

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

2. Déménagement

Les colonnes sont étiquetées AH de gauche à droite et 1 à 8 de bas en haut. L'utilisateur doit pouvoir saisir un mouvement sous la forme suivante:

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

Par exemple B1 C3, déplacer le chevalier sur la place devant le pion de l'évêque (en supposant que le jeu vient de commencer).

Alternativement, le système ICCF peut être utilisé, dans lequel les colonnes sont étiquetées de 1 à 8 au lieu de A à H. Ainsi, le mouvement de chevalier mentionné ci-dessus devient 21 33.

L'image suivante ( source ) clarifie les deux systèmes:

entrez la description de l'image ici

Le mouvement doit être exécuté et le nouveau tableau affiché. Toute capture résultante doit se produire lorsque le joueur d'échecs en mouvement retire le joueur d'échecs sur la case de destination du plateau.

Il n'est pas nécessaire de vérifier un mouvement d'échecs légal, car cela a été couvert dans d'autres défis: le plus petit programme d'échecs et le plus petit arbitre d'échecs Si l'utilisateur essaie de se déplacer d'une case vide, votre programme ou fonction doit ignorer le mouvement. Si l'utilisateur essaie de capturer une pièce amie, vous pouvez soit ignorer le mouvement, soit autoriser la capture de la pièce immobile.

Il n'est pas nécessaire de soutenir en passant ou en roque.

Vous pouvez supposer que l'entrée sera bien formée, c'est-à-dire toujours dans le format décrit ci-dessus. Les lettres seront toujours dans le même cas, vous pouvez décider de quel cas il s'agit.

3. Score et bonus

C'est le golf de code. Le code le plus court gagne.

-10% de bonus si votre programme ou fonction permet une promotion. L'utilisateur entre une troisième entrée, cette fois l'une des lettres suivantes: QBR N. Cela ne doit être autorisé que si le mouvement se termine par un pion sur la dernière ligne. Le pion est échangé contre la pièce nommée. QBRN.

-10% de bonus si votre programme ou fonction implémente un mouvement spécial "annuler" pour inverser les mouvements (dès le début du jeu si nécessaire.) Il est évidemment possible pour les joueurs amateurs de faire des mouvements illégaux, et ils peuvent souhaiter pour les défaire. Vous pouvez définir l'entrée que l'utilisateur doit donner pour ce mouvement "d'annulation" (il doit toujours être le même.) Le comportement n'est pas défini si l'utilisateur essaie d'annuler au-delà du début du jeu.

La somme des bonus, c'est-à-dire si vous optez pour les deux bonus, vous obtenez -20%.

Level River St
la source
Au début, vous dites "entrez un coup", et pour moi, cela signifie "juste un coup". Ensuite, il y a le bonus pour annuler "jusqu'au début": c'est donc une série complète de mouvements, pas un seul ... veuillez clarifier
edc65
@ edc65 c'est une série complète de mouvements. Voir la première ligne "autoriser les déplacements". La seule chose que je n'ai pas spécifiée est la condition de sortie de la boucle. Cela aurait pu être une idée d'arrêter quand l'un des rois est capturé, mais la réponse existante a une boucle infinie, ce qui est acceptable selon les spécifications telles qu'écrites, donc je vais la laisser.
Level River St
Le formatage des deux chevaliers sur des carrés noirs ne correspond pas. Qui est correct?
JWT
@JWT wow, personne ne l'avait remarqué avant! À ce stade, je devrai accepter les deux. Je vois que vous avez joué un peu plus à votre réponse. Avant de tester votre réponse et de modifier l'acceptation, avez-vous terminé?
Level River St
@ steveverril j'ai fini, oui.
JWT

Réponses:

4

Octave, 776 688 octets

688:

  • fonctions intégrées dans la boucle principale (les deux n'ont été utilisées qu'une seule fois),
  • notation de cellule utilisée {'foo','bar'}{i}à la place de légèrement plus longue['foo';'bar'](i,:)

Toujours aucun bonus mis en œuvre.


Utilise le système ICCF.

Il ne peut pas y avoir d'espaces de tête dans la description du déplacement et les champs source et destination doivent être séparés par un seul espace blanc, donc 42 44c'est correct, tandis que 42 44et 42 44ne le sont pas.

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

Version quelque peu non golfée:

# 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
la source
J'ai couru cela sur ideone.com et j'ai affiché le tableau, mais je n'ai pas pu l'accepter. Cela fonctionne très bien sur tutorialspoint.com/codingground.htm (sauf que le roi et la reine sont inversés - tout joueur d'échecs expérimenté vous dira que cela fait une différence.) Je vous donnerais un +1 supplémentaire pour ne pas permettre la capture d'un ami morceau, et un de plus pour l'explication décente, si je pouvais.
Level River St
@steveverrill En effet, les positions du roi et de la reine ont été inversées, merci de l'avoir signalé. C'est réparé maintenant.
pawel.boczarski
5

Rubis, 715 696 693 683 octets

C'est une solution assez compliquée mais je n'ai pas la patience de la nettoyer davantage pour le moment.

Aucun des bonus n'est fait.

Utilise le système 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
la source
Excellent, semble fonctionner parfaitement!
Level River St
@LevelRiverSt Il semble que cette réponse soit plus courte que celle actuellement acceptée.
Erik the Outgolfer
3

Python, 1136 890 753 octets

Toutes mes excuses pour la réponse partielle, mais je suis un débutant et j'ai vraiment apprécié ce défi. Je sais que c'est probablement très verbeux, mais voici mon brouillon:

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
la source
Merci d'avoir répondu. Nous avons coutume d'inclure une ligne de titre dans les réponses, avec la langue et le nombre d'octets. Quelle langue est-ce? Il ressemble à du python mais je n'arrive pas à le faire fonctionner sur ideone.com
Level River St
1
Supprimez tous les espaces autour =, et si un forou un ifn'a qu'une seule ligne à l'intérieur, tout peut aller sur la même ligne. Jetez un œil aux conseils pour jouer au golf en Python .
mbomb007