大炮可以去哪里?


9

介绍

象棋游戏,又称为中国象棋,是一种在中国,越南,台湾和其他东亚国家流行的象棋游戏。象棋两侧的颜色是红色和黑色。象棋有七个部分:将军(G),顾问(A),大象(E),马(H),战车(R),大炮(C)和士兵(S)。出于此挑战的目的,大写字母被认为是红色,小写字母被认为是黑色。这些棋子中的大多数与西方国际象棋的棋子大致相当,但是有一个完全独特的棋子:大炮。

移动像在国际象棋一个车或在象棋战车(移动的任何数量的在任一X或Y轴的空间),但不能攻击这种方式。相反,它沿着X或Y轴(它移动以同样的方式)在攻击由跳跃一个片的任何颜色(朋友或敌人)和着陆的相反色片,它然后捕获的。请注意,像所有国际象棋和象棋棋子一样,大炮无法捕捉到自己颜色的棋子。

例如,在下图中,假定大炮(C)可以移动到的空间标记为*,而大炮()可以跳转和捕获的空间标记为X,假设其中存在黑色/小写字母。

....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....

挑战

编写一个程序或函数,以象棋板和该板上的一门大炮的坐标为输入,输出一个大炮可以移动或跳转到的坐标列表。

所有I / O的格式都很灵活。

xiangqi板可接受的格式包括用换行符分隔的字符串,字符串列表或带有不在其中的任何其他分隔符的字符串aceghrsACEGHRS.。您可能会假设该板将始终为9x10,即祥起板的大小。

电路板本身的内容将由多个句点(.)组成,它们表示电路板上的空白点,而字符则表示块。字符到字符的映射如下:

A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier

大写字母代表红色,小写字母代表黑色。此处未列出的字符(即不在中aceghrsACEGHRS.)将不会出现在面板中。

输入坐标的格式是灵活的,不需要与输出坐标的格式匹配。例如,它可以是两个整数元素,两个元组,两个带分隔符的数字或两个字符的列表。它也可以是0索引或1索引。您可以假设板上的坐标将始终解析为大炮(Cc)。

加农炮可以跳转和移动到的坐标必须出现在输出的同一列表中。两者之间没有区别。任何单个输出坐标的可接受格式与输入坐标的格式相同。坐标可以用换行符分隔,作为列表输出或任何其他表示形式。不需要特定的命令;顺序甚至不必是确定性的。

请注意,跳到大炮相同颜色(大小写)的片段上是不合法的,因此不能出现在输出中。

测试用例

请注意,并非所有的测试用例都可以使用。

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)]

计分

这是 ,因此最短的答案(以字节为单位)获胜。打高尔夫球快乐!


3
祥奇+1。这是一个很棒的游戏,当我在一家中国公司工作时,我有机会向同事学习。总的感觉就像下棋(保持锐利的眼睛防守,但积极发挥),但战术是不同的(这是很好的早期把战车出来,而它的坏棋把乌鸦早早出局。)en.wikipedia .org / wiki / Xiangqi
Level River St St

@LevelRiverSt它不像国际象棋那样技术性强,并且感觉像是具有不同战略感觉的电子游戏。我喜欢!
noɥʇʎԀʎzɐɹƆ

似乎没有国王,但是有可能超过国王吗?
l4m2

Answers:


1

,112 +1 = 113字节

将输入作为命令行参数:两个坐标,后跟木板的10行。坐标基于0。输出坐标,如67 77,在同一行列表和同一列列表之间使用换行符。为-s标志添加一个字节。

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)

在线尝试!

有点不符合版本的说明

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)

默认情况下,Pip将命令行参数读入list g。它还存储在变量的第一五个参数a通过e。我们的前两个参数ab是大炮的坐标;g包含坐标,然后是木板的行。要仅获取木板g,我们从索引2开始对其进行切片,然后分配回gg@>:2)。

现在我们定义一个函数f。此函数有两个参数:代表板的行或列的字符串,以及该字符串中加农炮的索引。这些参数可在函数as a和中使用b。该函数将返回所有索引的列表,这些索引表示加农炮可以移动或捕获的地点。

首先,我们测试a@bC还是c。如果是C,我们将希望正则表达式[a-z]匹配它可以捕获的片段。如果是c,则正则表达式为[A-Z]。(高尔夫球代码从用于大小写字母的内置变量生成这些Y正则表达式。)我们将适当的正则表达式附加到该y变量中。

我们将字符串中的加农炮字符更改为@(以区别于同一行/列中的其他加农炮)。

接下来是一系列的正则表达式替换,这将改变加农炮可以转到空格字符的每个位置。第一个正则表达式\.*@\.*匹配项@由任意数量的周期包围,所有周期都代表加农炮可以移动到的空点。替换使用回调函数{aR'.s}将所有句点更改为空格。

下一个正则表达式与大炮可以捕获的部分相匹配:或[a-z][A-Z](取决于将其拉入哪个容器y),后跟\.*\w *@(任意数量的句点,一个字母,任意数量的空格和@)。这将匹配一个字符串h..R @(假设大炮为C)。回调函数s._@>1将第一个字符切开并留一个空格。

第三个正则表达式与此类似,但是在大炮之后而不是之前与可捕获的部分匹配。

最后,该函数a@*s使用find-all运算符返回,以获取所有空格的索引列表。

现在f,我们在加农炮的行上调用,并在加农炮的列上再次调用。该行的字符串为g@b,字符串中的大炮索引为a。该函数返回一个列号列表,在每个列号后附加行号b。打印列表时,-s标志在坐标对之间放置一个空格。

要获取列,我们使用Zip运算符进行转置g,选择index a,然后J将结果字符列表输入字符串。该字符串中的大炮索引为b。该函数返回一个行号列表,我们在每个行号之前添加列号a。该列表是程序中的最后一个表达式,将被自动打印。

(万一有人想知道的话,表达式分隔符;可以强制J将其解析为一元运算符而不是二进制运算符。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.