国际象棋残局:白棋交友


19

给定一个表示国际象棋当前状态的8x8字母网格,您的程序的任务是找到白色的下一棋,该棋将导致死战(答案将总是一move而就)。

输入项

输入将在STDIN上-8行,每行8个字符。每个字符的含义如下:

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

大写字母代表白色,小写字母代表黑色。板的方向将使白色从底部开始向上,黑色从顶部开始向下。

输出量

白色的移动会导致将死,并用代数符号表示。您无需注释何时拍下片段,也无需担心在两个相同的片段之间可以做出相同动作的歧义。

样品输入

例子1

输入:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

输出:

c6

例子2

输入:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

输出:

Nf5

例子3

输入:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

输出:

Rh5

您可以假定该解决方案将不涉及强制或被动。

这是代码高尔夫-最短的解决方案胜出。

(示例取自mateinone.com-谜题81、82和83)


否。我认为出于这个问题的目的,您可以假定答案将不会涉及cast回或en绕。我将更新问题。
加雷斯

我们应该如何处理不止一个合二为一的职位?
罗布

@Rob只需一个解决方案,因此输出您首先找到的解决方案。
Gareth

假设解决方案不涉及晋升也是安全的吗?
彼得·泰勒

@Peter是的,我不想使问题变得更加复杂。
Gareth

Answers:


7

Ruby,589 512 510 499 493个字符

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

输入是通过stdin给出的,例如:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

输出的结果不仅是迫使对方合为一体的一招,而且是这样做的每一步。

编辑1:该函数e仅使用一次,所以我对其进行了内联。其次,现在的编码基于数字5而不是10。重构板的克隆可以节省很多字符。

编辑2:仍然没有我想要的改善。将哈希值从更改{a=>b,c=>d}Hash[a,b,c,d]。这花费4个字符,但每个键值对节省一个字符。

编辑3:仅进行较小的归约:内联M(4个字符),t==?--> t<?.(2),在末尾以代数表示法除去Pawn(2),替换puts(3)。该程序现在少于500个字符。

编辑4:有趣的是,在这样的程序中还能找到多少。将不变式移到循环外,并找到另一个重复的计算。


“不是一个,而是任何一个”是指“不一定是一个,而是每个”吗?
马修(Matthew)读了

@马修你是对的。我的意思是“每个”。
霍华德

您可以使用[*$<]代替$<.map{|l|l}
Lowjacker
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.