首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置棋盘

设置棋盘
EN

Code Golf用户
提问于 2011-09-12 00:53:14
回答 1查看 586关注 0票数 7

目标

给定任意棋盘作为标准输入(其中每个棋子都在一个正方形上),作为标准输出,生成一个调整或设置棋盘所需的移动列表。这些举措不一定是合法的,但任何部分都不可能凌驾于另一部分之上。程序必须警告任何丢失或额外的部分;在后一种情况下,程序不需要生成一个移动列表。

一个普通的棋盘是一个棋盘,在其初始位置上有16个棋子,这些棋子在“国际棋盘手册”的国际象棋法部分中有描述。部分规则棋盘是一个棋盘,在常规棋盘的16块棋盘中至少少了一个棋盘,或者包括3-6级中的一个或多个棋盘(由普通棋盘中的空方格组成),而不是规则棋盘。

输入格式

描述

八行八个字符组成一个棋盘。连字符(-)表示空正方形。最后一行的第一个字符表示白色国王的车(代数符号中的a1)的规则位置,并且总是一个黑色的正方形;相邻的两个方块都是白色的方块(见图1)。

每种类型的作品都有一个不同的大写或小写字母来识别(参见图2)。普通棋盘上没有两个字母相同的棋子(除典当外),白色和黑色的棋子各有八个。

图1:普通板

代码语言:javascript
复制
rnbkqbnr
pppppppp
--------
--------
--------
--------
PPPPPPPP
RNBKQBNR

图2:片名、计数和字母

代码语言:javascript
复制
Piece    Count    White    Black
--------------------------------
King       1        K        k
Queen      1        Q        q
Bishop     2        B        b
Knight     2        N        n
Rook       2        R        r
Pawn       8        P        p

输出格式

程序每次输出一行。每一步都遵循<source><target>格式,其中<source>是被占用平方的代数表示法,<target>是未占用平方的代数表示法。(注:代数表示法是在附录C手册中描述的。)例如,程序将输出a4a5以将正方形a4上的部分移动到正方形a5上。

如果可能,产生的动作应使棋盘完全正规化。如果有任何部分从板中丢失,程序应输出必要的移动,以部分正规化板,然后一行包含'M‘,后面的字母,所有这样的部分。一个'M‘线不得输出,除非有至少一个缺失的部分。

如果董事会上存在任何额外的部分,则程序要么将其保留在3-6级,部分地将其正规化,要么( b)完全忽略其输出中的移动列表,即使丢失部分。在某些输入情况下,可能无法采用前一备选方案(a)。程序应在所有其他输出后,输出一行包含“A”的行,后面是所有其他部分的字母(如果有,则包括“M”行)。除非有至少一个额外的部分,否则不能输出'A‘线。

评分

该程序的分数应该是它的字符计数和在regboards.txt中的十个测试用例的移动总数的乘积。

测试用例

我已经在吉斯特上发布了可正则和非正则测试用例。在jsFiddle上,我发布了测试用例生成器/移动检查器以帮助您检查解决方案。将板放在第一个框中,移动列表放在第二个框中(既不包括'M‘也不包括'A’行),然后单击“进行移动”以执行程序生成的移动。要查看有效输出的示例,可以在测试用例上运行我的未镀金溶液 (采取482次移动)。

EN

回答 1

Code Golf用户

发布于 2011-09-13 22:59:38

Python,得分150552 =306个移动* 492个字符

代码语言:javascript
复制
import os,re
B=os.read(0,99)
R='rnbkqbnr-'+8*'p'+37*'-'+8*'P'+'-RNBKQBNR'
def P(x,y):print'%c%d%c%d'%(97+x%9,8-x/9,97+y%9,8-y/9)
F={}
M=''
t=B.find('-',18,56)
for x in range(71):
 if R[x]>'@':
  if R[x]==B[x]:B=B[:x]+'-'+B[x+1:]
  else:
   y=B.find(R[x])
   if y<0:M+=R[x]
   else:F[x]=y;B=B[:y]+'-'+B[y+1:]
A=re.sub(r'[-\n]','',B)
if M:print'M',M
if A:print'A',A
else:
 while F:
  p=[x for x in F if x not in F.values()]
  if p:x=p[0];y=F[x];P(y,x);del F[x]
  else:x=min(F);P(F[x],t);F[x]=t

代码记录了一个移动列表F,这将规范董事会。这个列表是通过从输入板B中选择一块到最终板R的每个位置,并在输入板上“划掉它”来生成的。任何缺失或额外的部分都是作为此计算的副作用计算出来的。然后从F进行移动,使用临时位置t来中断任何周期。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/3662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档