在棋盘上捕获


17

您应该编写一个程序或函数,该程序或函数接收代表棋盘的字符串,并仅以棋子作为输入和输出,或者返回是否可以在棋盘上进行任何捕获。

输入采用类似于FEN的表示法,描述白色和黑色棋子的位置,没有其他片段。您应该确定是否有可以捕获敌人的棋子。

每个等级都有描述,从等级8开始到等级1结束;在每个等级内,从文件“ a”到文件“ h”描述每个方块的内容。每个典当都由一个字母标识(白色典当=“ P”,黑色典当=“ p”,)。使用1到8的数字(空白方块的数量)标注空白方块,“ /”分隔等级。(部分取自维基百科)

例如

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

描述董事会

--------

pppppppp


    P   

PPPP PPP

--------

如果一个黑色的棋子位于对角线的上方(黑色是左上或右上),则一个黑色的棋子可以捕获一个黑色的棋子(如果白色的棋子位于对角线的下方),则黑色的棋子可以捕获一个白色的棋子。左下或右下)。不应考虑其他捕获动作(绕过)。

输入项

  • 一个FEN样串组成的字符12345678pP/
  • 输入内容描述了有效国际象棋游戏位置的棋子。这意味着(除其他更复杂的约束之外)每侧最多有8个棋子,等级1和8上没有棋子。

输出量

  • 如果双方都有可能被捕获,则应输出真实值,否则输出虚假值。

例子

具有真实输出的输入(每行一个)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

输入具有虚假输出(每行一个)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

这是代码高尔夫球,因此最短的入场券获胜。


示例板不应该用来描述8/pppppppp/8/8/8/7P/PPPP1PPP/8吗?
TheNumberOne 2015年

@TheNumberOne不,7P这意味着该典当位于最后的第8个文件中。(尽管该图是不正确的,但我已将其纠正。)
randomra

1
我觉得删除passpass使这个难题变得不那么有趣了。
corsiKa

Answers:


6

Pyth,25个字节

/smC,>JsXz`M9*LN9dJ,8T"Pp

测试套件

脚步:

通过用等号的引号(N)替换数字来转换输入。这保存在中J。然后,我们切掉前8个或10个字符,并将结果压缩为原始字符。任何捕获对都将转换为"Pp",因此我们在结果列表中找到该字符串的计数。这是输出。

另外,它实际上计算输入中可能捕获的次数。


另一个25解决方案::sXz`M9*LN9"p.{7}(..)?P"1可悲的是,最后一个参数:不是可选的(我认为应该是可选的)。
2015年

3
@Jakube会做。
isaacg

12

视网膜33 29字节

T`d`w
)`\d
$0.
_

p.{7}(..)?P

要从单个文件运行代码,请使用该-s标志。

应该容易被Perl之类的东西击败,Perl可以将数字扩展为空格(或其他字符)字符串,而不占用17个字节。

如果有可能捕获,则输出为正(真),否则为零(虚假)。

说明

T`d`w
)`\d
$0.

这是两个阶段的循环。第一个是音译阶段,将每个数字减1,然后将零变成下划线。为什么?因为dw扩展为以下两行:

0123456789
_0123456789AB...YZab...yz

如果音译阶段的目标集比源集长,那么多余的字符将被忽略,从而减少行为(老实说,我决定在扩展数字时将下划线放在数字前是很幸运的 w字符类) 。

然后第二阶段是替换,将a附加.到每个数字。这意味着对于每个数字nn在该数字变为下划线之前添加句点。

_
<empty>

这只是摆脱下划线。

p.{7}(..)?P

最后,找到匹配项。由于我们忽略了传递,因此只有在存在a p然后是a时才可能进行捕获P斜线。在线性字符串中,这仅表示两个棋子之间必须有7个或9个字符。与此匹配.{7}(..)?(即,匹配7个字符,然后可选地,匹配另外两个字符)。

这样的匹配阶段将返回找到的匹配数目。


关于“应该很容易被Perl之类的东西击败,其中将数字扩展为空格(或其他字符)的字符串不会占用17个字节。”:我无法让Perl连系您的得分,更不用说击败它了。(我的Perl回答。)但是也许其他人可以...
msh210 '16

3

Javascript,272个字符

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

可能还有很多改进的空间。


3

Ruby,145 123 46字节

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

我不知道为什么我一开始就没有考虑这一点。它要短得多,而且可读性强。

这是测试:http : //ideone.com/Gzav8N


旧方法:

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

在线测试:http : //ideone.com/9L01lf,打高尔夫之前的版本:http : //ideone.com/CSmqlW

此处提供修改的历史记录。


2

ES6,64字节

适当的字节数(如果持续)!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

我实际上是在不首先阅读其他答案的情况下想到了此解决方案的,但是如果您不相信我,我不会介意。



0

PHP,94 87 80字节

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

该loop + strtrpreg_replace_callbackwith 短很多str_pad


0

果冻88 84 79 72 69 65 64 63 60字节

绝对有改进的空间。不竞争,因为果冻是在问题之前创建的。感谢@lirtosiast告诉了我!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
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.