力扣的 1024・马尔可夫链卡牌活动编程实现

1024・马尔可夫链

2022 年 10 月 17 日 18:00 - 2022 年 10 月 31 日 18:00,参与「1024・马尔可夫链」游戏,完成指定行为可以获得力扣 1024 活动奖励。

  • 活动介绍:https://leetcode.cn/circle/discuss/JmX3M6/

游戏规则

活动期间用户可以使用已经获得的 数字牌 和 运算符号牌 进行运算;
单次运算只能是 2 个数字之间的运算,且运算过程不可逆;
在 3 次运算后, 运算结果为 1024 时记为成功,否则记为失败。失败时,将返还全部用于计算的卡牌(包括 数字牌 及 运算符号牌)。
运算结果的取值范围为 32 位有符号整数,超过此范围将提示报错。

作者:力扣 (LeetCode)
链接:https://leetcode.cn/circle/discuss/JmX3M6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

运算符号

运算操作 符号
加法 +
减法 -
乘法 *
幂运算 **
取余 %
整除 //
&
异或 ^
左移 <<
右移 >>

编程 Python 实现

def calculate_res(nums, ops):
    try:
        r1 = my_op(nums[0], nums[1], ops[0])
        r2 = my_op(r1, nums[2], ops[1])
        r3 = my_op(r2, nums[3], ops[2])
        if r3==1024:
            print(nums[0], ops[0],nums[1], '=',r1,'\t',r1, ops[1],nums[2],'=',r2,'\t',r2, ops[2],nums[3],'=',r3)
    except ZeroDivisionError:
        return 0
    return r3


def my_op(x, y, op):
    if op == '+':
        return x + y
    elif op == '-':
        return x - y
    elif op == '*':
        return x * y
    elif op == '//':    # 整除
        try:
            return x // y
        except ZeroDivisionError:
            raise ZeroDivisionError
    elif op == '**':    # 幂运算	
        try:
            return int(x ** y)
        except ZeroDivisionError:
            raise ZeroDivisionError
    elif op == '&':     # 与
        return x & y
    elif op == '|':     # 或
        return x | y
    elif op == '^':     # 异或	
        return x ^ y
    elif op == '>>':    # 右移	
        return x >> y
    elif op == '<<':    # 左移	
        return x << y
    elif op == '%':     # 取余	
        return x % y


if __name__ == '__main__':
    nums = [0, 0, 28, 2, 2, 2, 14,2]  # 填拥有的数字卡
    ops = [">>", "**", "//"]  # 请填入拥有的符号卡

    from itertools import permutations # 全排列

    for n_perm in permutations(nums, 4):
        for o_perm in permutations(ops, 3):
            try:
                res = calculate_res(n_perm, o_perm)
                if res == 1024:
                    print(n_perm, o_perm, n_perm[0],o_perm[0],n_perm[1])
                    print()
            except TypeError:
                pass