【Python CheckiO 题解】Pawn Brotherhood

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,传送门:https://checkio.org/,本博客主要记录自己在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。

题目描述

【Pawn Brotherhood】:这次的题目只有英文的,而且有点长,用百度翻译翻译了一下,然而一团糟,只知道是关于国际象棋的,其他不知道说的啥,为了搞懂题目意思,我甚至还百度了一下国际象棋怎么下,然而并没有什么用,于是我用我那小学六年级水平的英语,配合翻译软件和给的示例图,搞了半天才弄清楚题目啥意思,简单来说,题目会给一个字典,字典中的值就是一枚棋子的坐标,我们要统计安全的棋子的个数,怎么判断棋子是否安全呢?如果棋子的左下角或者右下角有其他棋子,那么这枚棋子就是安全的,以左图的 b4 位置的棋子为例,a3 位置没有棋子,但是 c3 位置有棋子,所以 b4 位置的棋子就是安全的,对于 d2 位置的棋子,因为 c1e1 位置都没棋子,所以就不安全。
在这里插入图片描述

【链接】:https://py.checkio.org/en/mission/pawn-brotherhood/

【输入】:由棋子坐标组成的字典(字典)

【输出】:处于安全位置的棋子的个数(整数)

【前提】:0 < pawns ≤ 8

【范例】

safe_pawns ({ “ b4” ,“ d4” ,“ f4” ,“ c3” ,“ e3” ,“ g5” ,“ d2” }== 6
safe_pawns ({ “ b4” ,“ c4” ,“ d4” ,“ e4” ,“ f4” ,“ g4” ,“ e5” }== 1

解题思路

个人感觉这题还是比较简单的,但是官网定的难度是中等,直接将字典中每一个值转换成列表,列表的元素分别是横向坐标和纵向坐标,对于其左下角的坐标,可以将其横向坐标和纵向坐标都减一,右下角的坐标类似,因为横向坐标是 a b c 的形式,我们可以先用 ord() 方法将其转换成 ASCII 码,做减法完成后再用 chr() 方法将其转换成 chr 类型,然后判断这个坐标是否在字典里就行了

代码实现

def safe_pawns(pawns: set) -> int:
    num = 0
    for i in pawns:
        left_pawns = chr(ord(list(i)[0])-1) + chr(ord(list(i)[1])-1)
        right_pawns = chr(ord(list(i)[0])+1) + chr(ord(list(i)[1])-1)
        if left_pawns in pawns or right_pawns in pawns:
            num += 1
    return num

if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert safe_pawns({"b4", "d4", "f4", "c3", "e3", "g5", "d2"}) == 6
    assert safe_pawns({"b4", "c4", "d4", "e4", "f4", "g4", "e5"}) == 1
    print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")

大神解答

大神解答 NO.1

def safe_pawns(pawns):
    answer = 0
    for pawn in pawns :
        if chr(ord(pawn[0])-1)+str(int(pawn[1])-1) in pawns or chr(ord(pawn[0])+1)+str(int(pawn[1])-1) in pawns : answer +=1
    return answer

大神解答 NO.2

def getdiags(pawn):
    c, r = map(ord, pawn)
    return chr(c - 1) + chr(r - 1), chr(c + 1) + chr(r - 1)

def safe_pawns(pawns):
    return len([p for p in pawns if any(d in pawns for d in getdiags(p))])

大神解答 NO.3

def safe_pawns(pawns):
    
    def is_safe(p):
        file, rank = ord(p[0]), int(p[-1])
        return (chr(file-1)+str(rank-1) in pawns or 
                chr(file+1)+str(rank-1) in pawns)
        
    return sum(is_safe(p) for p in pawns)

大神解答 NO.4

def safe_pawns(pawns):
    safe = lambda s: {chr(ord(s[0]) - 1) + str(int(s[1]) - 1),
        chr(ord(s[0]) + 1) + str(int(s[1]) - 1)}

    return sum([bool(set(pawns).intersection(safe(p))) for p in pawns ])

大神解答 NO.5

# migrated from python 2.7
def get_defenders(pawn):
    x, y = list(map(ord, pawn))
    return '%c%c' % (x - 1, y - 1), '%c%c' % (x + 1, y - 1)


def safe_pawns(pawns):
    return sum(not pawns.isdisjoint(get_defenders(x)) for x in pawns)
发布了115 篇原创文章 · 获赞 348 · 访问量 37万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览