网上看到了一个有趣的python问题,奈何自己才疏学浅做不出来

img


如图,小茗同学要能够正确的把宝石放在和石头符合的正确位置才能够打开密室的钥匙。
宝石一开始在石头的左上角的位置,宝石可以被顺时针旋转,也可以上下移动。
要求写一个function可以将宝石移动的过程记录下来,最后return出宝石横向和纵向移动的步长,和宝石旋转的角度。石头中如果没有和宝石相匹配的数字,则返回None。
我看到这个小游戏尝试做了一个小时都没有做的出来😭,是我太菜了啊。

 #!/usr/bin/python
# -*- coding: utf-8 -*-
stone = [[5,9,6,7],[9,8,4,3],[6,4,2,1]]
gem = [[1,2],[3,4]]
 
def stone_str(stone, r, l, rlen):
    return ''.join([str(i) for i in stone[r][l:l+rlen]])
def rotate0(gem, r):
    res = ''
    for i in gem[r]:
        res += str(i)
    return res
def rotate90(gem, r):
    res = ''
    for a in gem:
        res = str(a[r]) + res
    return res
def rotate180(gem, r):
    res = ''
    for i in gem[len(gem) - r - 1]:
        res = str(i) + res
    return res
def rotate270(gem, r):
    res = ''
    for a in gem:
        res += str(a[len(a) - r - 1])
    return res
 
def find_gem(v, glen, slen, func):
    h = stone_str(stone, v, 0, slen).find(func(gem, 0))
    if h != -1:
        f = True
        for j in range(1, glen):
            if stone_str(stone, v + j, h, h + glen) != func(gem, j):
                f = False
                break
        if f :
            return h, v
    return None
 
def open_door(stone, gem):
    glen = len(gem[0])
    slen = len(stone[0])
    func_map = {rotate0: 0,rotate90: 90,rotate180: 180,rotate270: 270}
    for v in range(len(stone) - len(gem) + 1):
        for func in func_map.keys():
            res = find_gem(v, glen, slen, func)
            if res is not None:
                return res[0], res[1], func_map[func]
    return None

print(open_door(stone, gem))
 

不知道题主写出来没

def open_door(key, door):
    n = 0  # 行
    m = 0  # 列
    # print('行数:{},列数:{}'.format(len(d), len(d[0])))
    maxn = len(d)
    maxm = len(d[0])
    a = [x for x in key[0] + list(reversed(key[1]))]  # 为了获取旋转坐标,反向拼接
    angle = -1
    while n < maxn - 1 and m < maxm - 1:
        b = [x for x in door[n][m:m + 2] + list(reversed(door[n + 1][m:m + 2]))]
        # print(b)
        t = 0
        j = 0
        i = 0
        for i in range(len(a)):
            if a[i] == b[j]:
                break
        for u in range(4):
            # print(a[(i + u) % 4],b[(j + u) % 4])
            if a[(i + u) % 4] == b[(j + u) % 4]:
                t += 1
            else:
                break
        if t != 4:
            if m < maxm - 2:
                m += 1
            elif n < maxn - 2:
                m = 0
                n += 1
            else:
                return None
            continue

        j = 0
        for i, v in enumerate(a):
            if v == b[j]:
                j += 1
                if angle == -1:
                    angle = i  # 首次匹配正确是0度,第二次是90度
                    # print(b,n,m,angle*90)
                    return m, n, angle * 90
    return None


k = [[1, 2],
     [3, 4]]
d = [[5, 9, 6, 7],
     [9, 8, 4, 3],
     [6, 4, 2, 1]]

print(open_door(k, d))