Où peut aller le canon?

9

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 ( Cou 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 , donc la réponse la plus courte (en octets) l'emporte. Bon golf!

Cuivre
la source
3
+1 pour Xiangqi. C'est un jeu génial, que j'ai eu l'occasion d'apprendre de mes collègues lorsque je travaillais pour une entreprise chinoise. La sensation générale est comme jouer aux échecs (gardez un œil attentif sur la défense mais jouez agressivement) mais les tactiques sont différentes (il est bon de faire sortir les chars tôt, alors qu'il est mauvais de sortir les tours tôt dans les échecs.) En.wikipedia .org / wiki / Xiangqi
Level River St
@LevelRiverSt est beaucoup moins technique que les échecs et ressemble à un jeu vidéo avec une sensation stratégique différente. Je l'aime!
noɥʇʎԀʎzɐɹƆ
Il semble qu'il n'y ait pas de roi, mais peut-il y en avoir plus que possible?
l4m2

Réponses:

1

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 -sdrapeau.

g@>:2P(f:{Ya@bQ'C?X^z;X^AZa@b:'@aR`\.*@\.*`{aR'.s}Ry.`\.*\w *@`s._@>1R`@ *\w\.*`.y_@<v.s@*s}g@ba).ba.(f;J(Zga)b)

Essayez-le en ligne!

Explication d'une version quelque peu non golfée

g@>:2
f:{
 Y a@bQ'C ? `[a-z]` `[A-Z]`
 a@b:'@
 aR:`\.*@\.*` {aR'.s}
 aR:y.`\.*\w *@` s._@>1
 aR:`@ *\w\.*`.y _@<v.s
 a@*s
}
P (f g@b a).b
a.(f; J(Zg)@a b)

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 à atravers e. Nos deux premiers arguments, aet b, sont les coordonnées du canon; gcontient les coordonnées suivies des rangées du tableau. Pour obtenir juste la carte g, 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 que aet b. 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@best Cou c. Si c'est le cas C, nous voulons que l'expression régulière [a-z]corresponde aux morceaux qu'elle peut capturer. Si c'est le cas c, 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.) Nous Yancrons l'expression rationnelle appropriée dans la yvariable.

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é yplus 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 comme h..R @(à condition que le canon l'était C). La fonction de rappel s._@>1coupe 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 fsur la ligne du canon et à nouveau sur la colonne du canon. La chaîne de la ligne est g@b, avec l'index du canon à l'intérieur de la chaîne a. La fonction renvoie une liste de numéros de colonnes, à chacun desquels nous ajoutons le numéro de ligne b. Lorsque la liste est imprimée, le -sdrapeau place un espace entre les paires de coordonnées.

Pour obtenir la colonne, nous utilisons l' Zopérateur ip pour transposer g, sélectionner l'index aet Jinsérer la liste résultante de caractères dans une chaîne. L'index du canon dans cette chaîne est b. La fonction renvoie une liste de numéros de ligne, à chacun desquels nous ajoutons le numéro de colonne a. 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' Janalyse en tant qu'opérateur unaire plutôt que binaire.)

DLosc
la source