python 窮舉法 算24點(史上最簡短代碼)


本來想用回溯法實現 算24點。題目都擬好了,就是《python 回溯法 子集樹模板 系列 —— 7、24點》。無奈想了一天,沒有頭緒。只好改用暴力窮舉法。

思路說明

根據四個數,三個運算符,構造三種中綴表達式,遍歷,計算每一種可能

顯然可能的形式不止三種。但是,其它的形式要么得不到24點,要么在加、乘意義下可以轉化為這三種形式的表達式!

使用內置的eval函數計算中綴表達式,使得代碼變得非常簡潔!

完整代碼

# 作者:hhh5460
# 時間:2017年6月3日

import itertools

def twentyfour(cards):
    '''史上最短計算24點代碼'''
    for nums in itertools.permutations(cards): # 四個數
        for ops in itertools.product('+-*/', repeat=3): # 三個運算符(可重復!)
            # 構造三種中綴表達式 (bsd)
            bds1 = '({0}{4}{1}){5}({2}{6}{3})'.format(*nums, *ops)  # (a+b)*(c-d)
            bds2 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*nums, *ops)  # (a+b)*c-d
            bds3 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*nums, *ops)  #  a/(b-(c/d))
            
            for bds in [bds1, bds2, bds3]: # 遍歷
                try:
                    if abs(eval(bds) - 24.0) < 1e-10:   # eval函數
                        return bds
                except ZeroDivisionError: # 零除錯誤!
                    continue
    
    return 'Not found!'


# 測試
# 數據來源:http://www.cnblogs.com/grenet/archive/2013/02/28/2936965.html
cards =[[1,1,1,8],
        [1,1,2,6],
        [1,1,2,7],
        [1,1,2,8],
        [1,1,2,9],
        [1,1,2,10],
        [1,1,3,4],
        [1,1,3,5],
        [1,1,3,6],
        [1,1,3,7],
        [1,1,3,8],
        [1,1,3,9],
        [1,1,3,10],
        [1,1,4,4],
        [1,1,4,5],
        [1,1,4,6],
        [1,1,4,7],
        [1,1,4,8],
        [1,1,4,9],
        [1,1,4,10],
        [1,1,5,5],
        [1,1,5,6],
        [1,1,5,7],
        [1,1,5,8],
        [1,1,6,6],
        [1,1,6,8],
        [1,1,6,9],
        [1,1,7,10],
        [1,1,8,8],
        [1,2,2,4],
        [1,2,2,5],
        [1,2,2,6],
        [1,2,2,7],
        [1,2,2,8],
        [1,2,2,9],
        [1,2,2,10],
        [1,2,3,3],
        [1,2,3,4],
        [1,2,3,5],
        [1,2,3,6],
        [1,2,3,7],
        [1,2,3,8],
        [1,2,3,9],
        [1,2,3,10],
        [1,2,4,4],
        [1,2,4,5],
        [1,2,4,6],
        [1,2,4,7],
        [1,2,4,8],
        [1,2,4,9],
        [1,2,4,10],
        [1,2,5,5],
        [1,2,5,6],
        [1,2,5,7],
        [1,2,5,8],
        [1,2,5,9],
        [1,2,5,10],
        [1,2,6,6],
        [1,2,6,7],
        [1,2,6,8],
        [1,2,6,9],
        [1,2,6,10],
        [1,2,7,7],
        [1,2,7,8],
        [1,2,7,9],
        [1,2,7,10],
        [1,2,8,8],
        [1,2,8,9],
        [1,2,8,10],
        [1,3,3,3],
        [1,3,3,4],
        [1,3,3,5],
        [1,3,3,6],
        [1,3,3,7],
        [1,3,3,8],
        [1,3,3,9],
        [1,3,3,10],
        [1,3,4,4],
        [1,3,4,5],
        [1,3,4,6],
        [1,3,4,7],
        [1,3,4,8],
        [1,3,4,9],
        [1,3,4,10],
        [1,3,5,6],
        [1,3,5,7],
        [1,3,5,8],
        [1,3,5,9],
        [1,3,5,10],
        [1,3,6,6],
        [1,3,6,7],
        [1,3,6,8],
        [1,3,6,9],
        [1,3,6,10],
        [1,3,7,7],
        [1,3,7,8],
        [1,3,7,9],
        [1,3,7,10],
        [1,3,8,8],
        [1,3,8,9],
        [1,3,8,10],
        [1,3,9,9],
        [1,3,9,10],
        [1,3,10,10],
        [1,4,4,4],
        [1,4,4,5],
        [1,4,4,6],
        [1,4,4,7],
        [1,4,4,8],
        [1,4,4,9],
        [1,4,4,10],
        [1,4,5,5],
        [1,4,5,6],
        [1,4,5,7],
        [1,4,5,8],
        [1,4,5,9],
        [1,4,5,10],
        [1,4,6,6],
        [1,4,6,7],
        [1,4,6,8],
        [1,4,6,9],
        [1,4,6,10],
        [1,4,7,7],
        [1,4,7,8],
        [1,4,7,9],
        [1,4,8,8],
        [1,4,8,9],
        [1,4,9,10],
        [1,4,10,10],
        [1,5,5,5],
        [1,5,5,6],
        [1,5,5,9],
        [1,5,5,10],
        [1,5,6,6],
        [1,5,6,7],
        [1,5,6,8],
        [1,5,6,9],
        [1,5,6,10],
        [1,5,7,8],
        [1,5,7,9],
        [1,5,7,10],
        [1,5,8,8],
        [1,5,8,9],
        [1,5,8,10],
        [1,5,9,9],
        [1,5,9,10],
        [1,5,10,10],
        [1,6,6,6],
        [1,6,6,8],
        [1,6,6,9],
        [1,6,6,10],
        [1,6,7,9],
        [1,6,7,10],
        [1,6,8,8],
        [1,6,8,9],
        [1,6,8,10],
        [1,6,9,9],
        [1,6,9,10],
        [1,7,7,9],
        [1,7,7,10],
        [1,7,8,8],
        [1,7,8,9],
        [1,7,8,10],
        [1,7,9,9],
        [1,7,9,10],
        [1,8,8,8],
        [1,8,8,9],
        [1,8,8,10],
        [2,2,2,3],
        [2,2,2,4],
        [2,2,2,5],
        [2,2,2,7],
        [2,2,2,8],
        [2,2,2,9],
        [2,2,2,10],
        [2,2,3,3],
        [2,2,3,4],
        [2,2,3,5],
        [2,2,3,6],
        [2,2,3,7],
        [2,2,3,8],
        [2,2,3,9],
        [2,2,3,10],
        [2,2,4,4],
        [2,2,4,5],
        [2,2,4,6],
        [2,2,4,7],
        [2,2,4,8],
        [2,2,4,9],
        [2,2,4,10],
        [2,2,5,5],
        [2,2,5,6],
        [2,2,5,7],
        [2,2,5,8],
        [2,2,5,9],
        [2,2,5,10],
        [2,2,6,6],
        [2,2,6,7],
        [2,2,6,8],
        [2,2,6,9],
        [2,2,6,10],
        [2,2,7,7],
        [2,2,7,8],
        [2,2,7,10],
        [2,2,8,8],
        [2,2,8,9],
        [2,2,8,10],
        [2,2,9,10],
        [2,2,10,10],
        [2,3,3,3],
        [2,3,3,5],
        [2,3,3,6],
        [2,3,3,7],
        [2,3,3,8],
        [2,3,3,9],
        [2,3,3,10],
        [2,3,4,4],
        [2,3,4,5],
        [2,3,4,6],
        [2,3,4,7],
        [2,3,4,8],
        [2,3,4,9],
        [2,3,4,10],
        [2,3,5,5],
        [2,3,5,6],
        [2,3,5,7],
        [2,3,5,8],
        [2,3,5,9],
        [2,3,5,10],
        [2,3,6,6],
        [2,3,6,7],
        [2,3,6,8],
        [2,3,6,9],
        [2,3,6,10],
        [2,3,7,7],
        [2,3,7,8],
        [2,3,7,9],
        [2,3,7,10],
        [2,3,8,8],
        [2,3,8,9],
        [2,3,8,10],
        [2,3,9,9],
        [2,3,9,10],
        [2,3,10,10],
        [2,4,4,4],
        [2,4,4,5],
        [2,4,4,6],
        [2,4,4,7],
        [2,4,4,8],
        [2,4,4,9],
        [2,4,4,10],
        [2,4,5,5],
        [2,4,5,6],
        [2,4,5,7],
        [2,4,5,8],
        [2,4,5,9],
        [2,4,5,10],
        [2,4,6,6],
        [2,4,6,7],
        [2,4,6,8],
        [2,4,6,9],
        [2,4,6,10],
        [2,4,7,7],
        [2,4,7,8],
        [2,4,7,9],
        [2,4,7,10],
        [2,4,8,8],
        [2,4,8,9],
        [2,4,8,10],
        [2,4,9,9],
        [2,4,9,10],
        [2,4,10,10],
        [2,5,5,7],
        [2,5,5,8],
        [2,5,5,9],
        [2,5,5,10],
        [2,5,6,6],
        [2,5,6,7],
        [2,5,6,8],
        [2,5,6,9],
        [2,5,6,10],
        [2,5,7,7],
        [2,5,7,8],
        [2,5,7,9],
        [2,5,7,10],
        [2,5,8,8],
        [2,5,8,9],
        [2,5,8,10],
        [2,5,9,10],
        [2,5,10,10],
        [2,6,6,6],
        [2,6,6,7],
        [2,6,6,8],
        [2,6,6,9],
        [2,6,6,10],
        [2,6,7,8],
        [2,6,7,9],
        [2,6,7,10],
        [2,6,8,8],
        [2,6,8,9],
        [2,6,8,10],
        [2,6,9,9],
        [2,6,9,10],
        [2,6,10,10],
        [2,7,7,8],
        [2,7,7,10],
        [2,7,8,8],
        [2,7,8,9],
        [2,7,9,10],
        [2,7,10,10],
        [2,8,8,8],
        [2,8,8,9],
        [2,8,8,10],
        [2,8,9,9],
        [2,8,9,10],
        [2,8,10,10],
        [2,9,10,10],
        [3,3,3,3],
        [3,3,3,4],
        [3,3,3,5],
        [3,3,3,6],
        [3,3,3,7],
        [3,3,3,8],
        [3,3,3,9],
        [3,3,3,10],
        [3,3,4,4],
        [3,3,4,5],
        [3,3,4,6],
        [3,3,4,7],
        [3,3,4,8],
        [3,3,4,9],
        [3,3,5,5],
        [3,3,5,6],
        [3,3,5,7],
        [3,3,5,9],
        [3,3,5,10],
        [3,3,6,6],
        [3,3,6,7],
        [3,3,6,8],
        [3,3,6,9],
        [3,3,6,10],
        [3,3,7,7],
        [3,3,7,8],
        [3,3,7,9],
        [3,3,8,8],
        [3,3,8,9],
        [3,3,8,10],
        [3,3,9,9],
        [3,3,9,10],
        [3,4,4,4],
        [3,4,4,5],
        [3,4,4,6],
        [3,4,4,7],
        [3,4,4,8],
        [3,4,4,9],
        [3,4,4,10],
        [3,4,5,5],
        [3,4,5,6],
        [3,4,5,7],
        [3,4,5,8],
        [3,4,5,9],
        [3,4,5,10],
        [3,4,6,6],
        [3,4,6,8],
        [3,4,6,9],
        [3,4,6,10],
        [3,4,7,7],
        [3,4,7,8],
        [3,4,7,9],
        [3,4,7,10],
        [3,4,8,9],
        [3,4,8,10],
        [3,4,9,9],
        [3,4,10,10],
        [3,5,5,6],
        [3,5,5,7],
        [3,5,5,8],
        [3,5,5,9],
        [3,5,6,6],
        [3,5,6,7],
        [3,5,6,8],
        [3,5,6,9],
        [3,5,6,10],
        [3,5,7,8],
        [3,5,7,9],
        [3,5,7,10],
        [3,5,8,8],
        [3,5,8,9],
        [3,5,9,9],
        [3,5,9,10],
        [3,5,10,10],
        [3,6,6,6],
        [3,6,6,7],
        [3,6,6,8],
        [3,6,6,9],
        [3,6,6,10],
        [3,6,7,7],
        [3,6,7,8],
        [3,6,7,9],
        [3,6,7,10],
        [3,6,8,8],
        [3,6,8,9],
        [3,6,8,10],
        [3,6,9,9],
        [3,6,9,10],
        [3,6,10,10],
        [3,7,7,7],
        [3,7,7,8],
        [3,7,7,9],
        [3,7,7,10],
        [3,7,8,8],
        [3,7,8,9],
        [3,7,9,9],
        [3,7,9,10],
        [3,7,10,10],
        [3,8,8,8],
        [3,8,8,9],
        [3,8,8,10],
        [3,8,9,9],
        [3,8,9,10],
        [3,8,10,10],
        [3,9,9,9],
        [3,9,9,10],
        [3,9,10,10],
        [4,4,4,4],
        [4,4,4,5],
        [4,4,4,6],
        [4,4,4,7],
        [4,4,4,8],
        [4,4,4,9],
        [4,4,4,10],
        [4,4,5,5],
        [4,4,5,6],
        [4,4,5,7],
        [4,4,5,8],
        [4,4,5,10],
        [4,4,6,8],
        [4,4,6,9],
        [4,4,6,10],
        [4,4,7,7],
        [4,4,7,8],
        [4,4,7,9],
        [4,4,7,10],
        [4,4,8,8],
        [4,4,8,9],
        [4,4,8,10],
        [4,4,10,10],
        [4,5,5,5],
        [4,5,5,6],
        [4,5,5,7],
        [4,5,5,8],
        [4,5,5,9],
        [4,5,5,10],
        [4,5,6,6],
        [4,5,6,7],
        [4,5,6,8],
        [4,5,6,9],
        [4,5,6,10],
        [4,5,7,7],
        [4,5,7,8],
        [4,5,7,9],
        [4,5,7,10],
        [4,5,8,8],
        [4,5,8,9],
        [4,5,8,10],
        [4,5,9,9],
        [4,5,9,10],
        [4,5,10,10],
        [4,6,6,6],
        [4,6,6,7],
        [4,6,6,8],
        [4,6,6,9],
        [4,6,6,10],
        [4,6,7,7],
        [4,6,7,8],
        [4,6,7,9],
        [4,6,7,10],
        [4,6,8,8],
        [4,6,8,9],
        [4,6,8,10],
        [4,6,9,9],
        [4,6,9,10],
        [4,6,10,10],
        [4,7,7,7],
        [4,7,7,8],
        [4,7,8,8],
        [4,7,8,9],
        [4,7,8,10],
        [4,7,9,9],
        [4,7,9,10],
        [4,7,10,10],
        [4,8,8,8],
        [4,8,8,9],
        [4,8,8,10],
        [4,8,9,9],
        [4,8,9,10],
        [4,8,10,10],
        [4,9,9,10],
        [5,5,5,5],
        [5,5,5,6],
        [5,5,5,9],
        [5,5,6,6],
        [5,5,6,7],
        [5,5,6,8],
        [5,5,7,7],
        [5,5,7,8],
        [5,5,7,10],
        [5,5,8,8],
        [5,5,8,9],
        [5,5,8,10],
        [5,5,9,9],
        [5,5,9,10],
        [5,5,10,10],
        [5,6,6,6],
        [5,6,6,7],
        [5,6,6,8],
        [5,6,6,9],
        [5,6,6,10],
        [5,6,7,7],
        [5,6,7,8],
        [5,6,7,9],
        [5,6,8,8],
        [5,6,8,9],
        [5,6,8,10],
        [5,6,9,9],
        [5,6,9,10],
        [5,6,10,10],
        [5,7,7,9],
        [5,7,7,10],
        [5,7,8,8],
        [5,7,8,9],
        [5,7,8,10],
        [5,7,9,10],
        [5,7,10,10],
        [5,8,8,8],
        [5,8,8,9],
        [5,8,8,10],
        [5,9,10,10],
        [6,6,6,6],
        [6,6,6,8],
        [6,6,6,9],
        [6,6,6,10],
        [6,6,7,9],
        [6,6,7,10],
        [6,6,8,8],
        [6,6,8,9],
        [6,6,8,10],
        [6,6,9,10],
        [6,7,7,10],
        [6,7,8,9],
        [6,7,8,10],
        [6,7,9,9],
        [6,7,10,10],
        [6,8,8,8],
        [6,8,8,9],
        [6,8,8,10],
        [6,8,9,9],
        [6,8,9,10],
        [6,9,9,10],
        [6,10,10,10],
        [7,7,9,10],
        [7,8,8,9],
        [7,8,8,10],
        [7,8,9,10],
        [7,8,10,10],
        [8,8,8,10]]

for card in cards:
    print(twentyfour(card))


以上數據全都pass,圖我就不截了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM