24点python实现

题目:

有四张扑克牌,每张为2-A,10以上的J、Q、K、A按1算,加减任意顺序组合,能否算出24点。
例如
10、10、3、A,10+10+3+A=24,返回true
A、A、A、A,算不出24,返回false

题意分析

1、4张牌最少要有3张相加才能等于24
2、加减任意那么有:A+B+C+D、-A+B+C+D、A-B+C+D、A+B-C+D、A+B+C-D 一共5种情况

代码实现1:直接套5种情况

def point24(string):
    inp = (
        string.replace("A", "1")
        .replace("J", "1")
        .replace("Q", "1")
        .replace("K", "1")
        .rsplit("、")
    )

    k = ["%s+%s+%s+%s", "-%s+%s+%s+%s", "+%s-%s+%s+%s", "+%s+%s-%s+%s", "%s+%s+%s-%s"]
    flag = False
    for i in range(len(k)):
        a = eval(k[i] % (inp[0], inp[1], inp[2], inp[3]))
        if a == 24:
            flag = True
            break
    return flag


if __name__ == "__main__":
    # 单元测试 覆盖

    fn = point24_
    assert fn("10、10、4、1") is False
    assert fn("10、10、3、A")
    assert fn("10、10、10、10") is False
    assert fn("6、10、10、10")
    assert fn("10、6、10、10")
    assert fn("10、10、6、10")
    assert fn("10、10、10、6")
    assert fn("1、10、5、10")

代码实现2:排序后再进行运算

def point24_(string):
    inp = (
        string.replace("A", "1")
            .replace("J", "1")
            .replace("Q", "1")
            .replace("K", "1")
            .rsplit("、")
    )
    inp = [int(i) for i in inp]
    inp.sort()
    inp.reverse()
    s = 0
    for i in range(len(inp)):
        if s < 24:
            if (s + int(inp[i])) == 24 and i == 3:
                return True
            else:
                s += int(inp[i])
        elif (s - int(inp[i])) == 24:
            return True
    else:
        print(inp)
        return False


if __name__ == "__main__":
    # 单元测试 覆盖

    fn = point24_
    assert fn("10、10、4、1") is False
    assert fn("10、10、3、A")
    assert fn("10、10、10、10") is False
    assert fn("6、10、10、10")
    assert fn("10、6、10、10")
    assert fn("10、10、6、10")
    assert fn("10、10、10、6")
    assert fn("1、10、5、10")
原文地址:https://www.cnblogs.com/Klay/p/15003541.html