给出棋盘上棋子的坐标,表示为一组弦,即。 {“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
答案 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}