zoukankan      html  css  js  c++  java
  • 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")
    
  • 相关阅读:
    HDU 3091 Necklace <<状压dp
    HDU 1074 Doing Homework<<状压dp
    单片机程序设计中的“分层思想”
    单片机的 FIFO循环队列实现
    串口多字节接收
    单片机多字节串口接收(转)
    SD卡应用总结(Fatfs)
    FATFS 初学之 磁盘 I/O接口
    FATFS 初学之 f_gets/ f_putc/ f_puts/ f_printf
    FATFS 初学之 f_chdir/ f_chdrive
  • 原文地址:https://www.cnblogs.com/Klay/p/15003541.html
Copyright © 2011-2022 走看看