给定棋盘上棋子的坐标,计算'安全棋子',Python

时间:2014-08-13 06:08:09

标签: python

给出棋盘上棋子的坐标,表示为一组弦,即。 {“b4”,“d4”,“f4”,“c3”,“e3”,“g5”,“d2”},其中电路板由行表示为数字,列为字母字符。确定受保护的棋子的数量,即棋盘上对角线后面的其他棋子的棋子数量。 我正在尝试自学python并且已经完成了这个任务数小时。任何帮助将不胜感激。 这是我令人尴尬的混乱尝试:

def safe_pawns(pawns):
    count = 0
    cols = "abcdefgh"
    positions = {'a':[],'b':[],'c':[],'d':[],'e':[],'f':[],'g':[],'h':[]}
    for i in positions:
        for j in pawns:
            if i in j:
                positions[i].append(int(j[1]))
    for k in range(len(cols)-1):
        for l in positions[cols[k+1]]:
            if l +1 or l-1 in positions[cols[k]]:
                count +=1
    return count

2 个答案:

答案 0 :(得分:2)

我愿意打赌这是你的问题:

if l +1 or l-1 in positions[cols[k]]:

这并不意味着“如果l + 1在那个插槽中,或者l-1在那个插槽中”。如果你的意思(你几乎肯定这样做),你必须说:

if l+1 in positions[cols[k]] or l-1 in positions[cols[k]]:

(有很多方法可以间接地编写它,比如if {l+1, l-1}.intersection(positions[cols[k]]),但我认为显式版本在这里显而易见。)

答案 1 :(得分:1)

首先,在开始进行算术运算后,使用字母列会导致问题,因为你不能只做'b' - 1。如果您将一组字符串(如'a1')转换为一组像(1, 1)这样的元组,则会更容易。 (或者你可以零索引,但我认为这超出了范围)。

其次,我们假设您现在设置了一个{(2, 4), (3, 3), (4, 2), (4, 4), (5, 3), (6, 4), (7, 5)}的典当。你不需要那么多循环。你实际上可以得到一组受保护的部分(我假设你是从棋盘游戏的“底部”开始?)使用一个集合表达式:

{(x,y) for (x,y) in s if (x-1,y-1) in s or (x+1,y-1) in s}

你会发现它的大小是6。

注意:我使用的输入转换表达式为:

s = {("abcdefg".find(let) + 1, int(num)) for let, num in pawns}