introduction
Le jeu de xiangqi , également connu sous le nom d'échecs chinois, est un jeu d'échecs populaire en Chine, au Vietnam, à Taiwan et dans d'autres pays d'Asie de l'Est. Les couleurs des deux côtés en xiangqi sont rouge et noir. Il y a sept pièces dans xiangqi: le général ( G
), le conseiller ( A
), l'éléphant ( E
), le cheval ( H
), le char ( R
), le canon ( C
) et le soldat ( S
). Pour les besoins de ce défi, les pièces en majuscules sont considérées comme des pièces rouges et noires en minuscules. La plupart de ces pièces ont un équivalent approximatif dans les échecs occidentaux, mais il y a une pièce tout à fait unique: le canon.
Le canon se déplace comme une tour d'échecs ou un char en xiangqi (déplaçant n'importe quel nombre d'espaces sur les axes X ou Y), mais ne peut pas attaquer de cette façon. Au lieu de cela, il attaque en sautant le long des axes X ou Y (de la même manière qu'il se déplace) sur une pièce de n'importe quelle couleur (ami ou ennemi) et atterrissant sur la pièce de couleur opposée, qu'il capture ensuite. Notez que comme toutes les pièces d'échecs et de xiangqi, les canons ne peuvent pas capturer des pièces de leur propre couleur.
Par exemple, dans le diagramme suivant, les espaces vers lesquels le canon ( C
) peut se déplacer sont marqués avec *
, et ceux vers lesquels il peut sauter et capturer sont marqués avec X
, en supposant qu'il y a une pièce noire / minuscule.
....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....
Défi
Écrivez un programme ou une fonction qui, étant donné un tableau xiangqi et les coordonnées d'un canon sur ce tableau en entrée, génère une liste de coordonnées auxquelles le canon peut se déplacer ou sauter.
Le format de toutes les E / S est flexible.
Les formats acceptables pour la carte xiangqi incluent une chaîne séparée par une nouvelle ligne, une liste de chaînes ou une chaîne avec tout autre séparateur absent aceghrsACEGHRS.
. Vous pouvez supposer que le tableau sera toujours de 9 x 10, la taille d'un tableau xiangqi.
Le contenu du tableau lui-même comprendra un certain nombre de points ( .
), représentant des points vides sur le tableau, et des personnages représentant des pièces. Le mappage morceau à personnage est le suivant:
A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier
Les lettres majuscules représentent les pièces rouges et les lettres minuscules les pièces noires. Les personnages non répertoriés ici (c'est-à-dire non inclus aceghrsACEGHRS.
) n'apparaîtront pas dans le tableau.
Le format des coordonnées d'entrée est flexible et n'est pas requis pour correspondre au format des coordonnées de sortie. Il peut s'agir d'une liste de deux éléments entiers, un 2-tuple, deux nombres avec n'importe quel séparateur, ou deux caractères, par exemple. Il peut également être indexé 0 ou indexé 1. Vous pouvez supposer que les coordonnées sur le plateau se résoudront toujours en canon ( C
ou c
).
Les coordonnées auxquelles le canon peut sauter et se déplacer doivent apparaître dans la même liste en sortie; la distinction entre les deux n'est pas nécessaire. Les formats acceptables pour toutes les coordonnées de sortie individuelles sont les mêmes que ceux pour les coordonnées d'entrée. Les coordonnées peuvent être séparées par des sauts de ligne, sorties sous forme de liste ou toute autre représentation. Aucun ordre particulier n'est nécessaire; l'ordre n'a même pas à être déterministe.
Notez que les sauts sur un morceau de la même couleur (boîtier) du canon ne sont pas légaux et ne peuvent donc pas apparaître dans la sortie.
Cas de test
Notez que tous les cas de test ne sont pas des positions xiangqi possibles.
Input board
Input coordinate (0-indexed)
List of output coordinates
.........
.........
.........
.........
.........
....C....
.........
.........
.........
.........
(4, 5)
[(0, 5), (1, 5), (2, 5), (3, 5), (5, 5), (6, 5), (7, 5), (8, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 6), (4, 7), (4, 8), (4, 9)]
.........
.....G...
.........
.........
.....e...
.........
.........
h..R.c..S
.....a...
.........
(5, 7)
[(4, 7), (6, 7), (7, 7), (5, 6), (5, 5), (5, 1)]
..s......
..A...e..
.........
EACCcsh.H
..r......
.....S...
......s..
....C....
..g......
(2, 3)
[(2, 0), (2, 2), (4, 3), (2, 9)]
rheagaehr
.........
.c.....c.
s.s.s.s.s
.........
.........
S.S.S.S.S
.C.....C.
.........
RHEAGAEHR
(7, 7)
[(2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (8, 7), (7, 0), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8)]
Notation
Il s'agit de code-golf , donc la réponse la plus courte (en octets) l'emporte. Bon golf!
la source
Réponses:
Pip , 112 + 1 = 113 octets
Prend l'entrée comme arguments de ligne de commande: les deux coordonnées, suivies des 10 lignes du tableau. Les coordonnées sont basées sur 0. Affiche des coordonnées comme
67 77
, avec une nouvelle ligne entre la même liste de lignes et la même liste de colonnes. Un octet ajouté pour le-s
drapeau.Essayez-le en ligne!
Explication d'une version quelque peu non golfée
Par défaut, Pip lit les arguments de ligne de commande dans la liste
g
. Il stocke également les cinq premiers arguments dans les variables àa
traverse
. Nos deux premiers arguments,a
etb
, sont les coordonnées du canon;g
contient les coordonnées suivies des rangées du tableau. Pour obtenir juste la carteg
, nous la coupons à partir de l'index 2 et l'assignons àg
(g@>:2
).Nous définissons maintenant une fonction
f
. Cette fonction prend deux arguments: une chaîne représentant une ligne ou une colonne du plateau et l'index du canon dans cette chaîne. Ces arguments sont disponibles dans la fonction en tant quea
etb
. La fonction renverra une liste de tous les indices qui représentent les endroits vers lesquels le canon peut se déplacer ou capturer.Tout d'abord, nous testons si
a@b
estC
ouc
. Si c'est le casC
, nous voulons que l'expression régulière[a-z]
corresponde aux morceaux qu'elle peut capturer. Si c'est le casc
, l'expression rationnelle l'est[A-Z]
. (Le code golfé génère ces expressions rationnelles à partir des variables intégrées pour l'alphabet minuscule et majuscule.) NousY
ancrons l'expression rationnelle appropriée dans lay
variable.Nous changeons le caractère du canon dans la chaîne en
@
(pour le distinguer des autres canons de la même ligne / colonne).Vient ensuite une série de remplacements de regex, qui changeront chaque endroit où le canon peut aller à un personnage de l'espace. Les premiers
\.*@\.*
matchs regex@
entourés d'un certain nombre de périodes, qui représentent tous des espaces vides vers lesquels le canon peut se déplacer. Le remplacement utilise une fonction de rappel{aR'.s}
pour changer toutes les périodes en espaces.Le regex suivant correspond à un morceau que le canon peut capturer: soit
[a-z]
ou[A-Z]
(selon celui qui a été tiréy
plus tôt) suivi par\.*\w *@
(n'importe quel nombre de périodes, une lettre, n'importe quel nombre d'espaces, et@
). Cela correspondra à une chaîne commeh..R @
(à condition que le canon l'étaitC
). La fonction de rappels._@>1
coupe le premier caractère et ajoute un espace.Le troisième regex est similaire, mais correspond à une pièce capturable après le canon plutôt qu'avant.
Enfin, la fonction revient
a@*s
, en utilisant l'opérateur find-all pour obtenir une liste des indices de tous les espaces.Nous appelons maintenant
f
sur la ligne du canon et à nouveau sur la colonne du canon. La chaîne de la ligne estg@b
, avec l'index du canon à l'intérieur de la chaînea
. La fonction renvoie une liste de numéros de colonnes, à chacun desquels nous ajoutons le numéro de ligneb
. Lorsque la liste est imprimée, le-s
drapeau place un espace entre les paires de coordonnées.Pour obtenir la colonne, nous utilisons l'
Z
opérateur ip pour transposerg
, sélectionner l'indexa
etJ
insérer la liste résultante de caractères dans une chaîne. L'index du canon dans cette chaîne estb
. La fonction renvoie une liste de numéros de ligne, à chacun desquels nous ajoutons le numéro de colonnea
. Cette liste, étant la dernière expression du programme, est imprimée automatiquement.(Au cas où quelqu'un se poserait la question, le séparateur d'expression
;
est là pour forcer l'J
analyse en tant qu'opérateur unaire plutôt que binaire.)la source