最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)快速計(jì)算24點(diǎn)游戲的示例代碼

 更新時間:2022年12月02日 08:17:04   作者:小小明-代碼實(shí)體  
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)快速計(jì)算24點(diǎn)游戲并獲取表達(dá)式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

24 點(diǎn)游戲規(guī)則

有4個范圍在 [1,9] 的數(shù)字,通過「加、減、乘、除」四則運(yùn)算能夠獲得24,認(rèn)為有解。

4個范圍在 [1,9] 的數(shù)字能夠產(chǎn)生495種可能,其中404中組合情況都是有解的,有解概率高達(dá)81.62%。

下面我們用python來驗(yàn)證它,首先計(jì)算組合數(shù):

from scipy.special import comb

comb(9, 4, repetition=True)

495.0

可以看到python計(jì)算出9個數(shù)字有重復(fù)的組合情況數(shù)是495。

下面我們需要一個方法,判斷4個數(shù)字能否組合成為24點(diǎn),這里我采用回溯算法進(jìn)行計(jì)算。

回溯算法計(jì)算思路

首先從4個數(shù)字中選擇2個數(shù)字,然后再選擇一種運(yùn)算操作,然后用得到的結(jié)果取代選出的2個數(shù)字。然后在剩下的3個數(shù)字中,進(jìn)行同樣的操作。依次類推,最終計(jì)算到只剩一個數(shù)字,看結(jié)果是否為24即可。

開始編碼:

from operator import add, mul, sub, truediv

ops = [add, mul, sub, truediv]


def judgePoint24(nums) -> bool:
    if not nums:
        return False
    n = len(nums)
    if n == 1:
        return round(nums[0], 3) == 24
    for i, j in permutations(range(n), 2):
        # 選2個數(shù)字
        x, y = nums[i], nums[j]
        newNums = []
        # 選擇加減乘除 4 種運(yùn)算操作之一,用得到的結(jié)果取代選出的 2 個數(shù)字
        for k, z in enumerate(nums):
            if k != i and k != j:
                newNums.append(z)
        for k in range(4):
            if k < 2 and i > j:
                # 加法和乘法滿足交換律,跳過第二種順序
                continue
            if k == 3 and round(y, 3) == 0:
                # 除法運(yùn)算除數(shù)不能為0
                continue
            newNums.append(ops[k](x, y))
            if judgePoint24(newNums):
                return True
            newNums.pop()
    return False

然后我們遍歷所有的組合進(jìn)行判斷:

from scipy.special import comb

???????total = int(comb(9, 4, repetition=True))
cnt = sum(judgePoint24(nums)
          for nums in combinations_with_replacement(range(1, 10), 4))
print(f'{cnt}/{total}={cnt/total:.2%}')

最終一秒內(nèi)計(jì)算出結(jié)果:

生成表達(dá)式

下面我們加大難度,要求在求解時,能夠同時返回可行的表達(dá)式。暴力遍歷固然可以實(shí)現(xiàn),但是耗時太長,能否在這種回溯算法的基礎(chǔ)上實(shí)現(xiàn)呢?

我的思路是加個變量記錄每次的選擇,最終再通過一定的技巧進(jìn)行還原,最終編碼:

from operator import add, mul, sub, truediv
from itertools import permutations, combinations_with_replacement
from collections import defaultdict


def judgePoint24(nums) -> bool:
    ops = [add, mul, sub, truediv]
    op_char = "+*-/"
    record = []

    def solve(nums) -> bool:
        if not nums:
            return False
        n = len(nums)
        if n == 1:
            return round(nums[0], 3) == 24
        for i, j in permutations(range(n), 2):
            # 選2個數(shù)字
            x, y = nums[i], nums[j]
            newNums = []
            # 選擇加減乘除 4 種運(yùn)算操作之一,用得到的結(jié)果取代選出的 2 個數(shù)字
            # 先添加未選擇的數(shù)字
            newNums = [z for k, z in enumerate(nums) if k not in (i, j)]
            for k in range(4):
                if k < 2 and i > j:
                    # 加法和乘法滿足交換律,跳過第二種順序
                    continue
                if k == 3 and (round(y, 3) == 0):
                    # 除法運(yùn)算除數(shù)不能為0
                    continue
                v = ops[k](x, y)
                newNums.append(v)
                record.append(([round(x, 3), round(y, 3)],
                              op_char[k], round(v, 3)))
                if solve(newNums):
                    return True
                newNums.pop()
                record.pop()
        return False
    flag = solve(nums)
    if not flag:
        return False, ""
    cache = defaultdict(list)
    for ns, op, v in record:
        for i in range(2):
            if cache[ns[i]]:
                ns[i] = "("+cache[ns[i]].pop()+")"
        a, b = ns
        cache[v].append(f"{a}{op}")
    return flag, cache[24][0]+"=24"

然后開始遍歷:

total = cnt = 0
for nums in combinations_with_replacement(range(1, 10), 4):
    total += 1
    r, expression = judgePoint24(nums)
    if r:
        print(expression, end="\t")
        cnt += 1
        if cnt % 8 == 0:
            print()
print()
print(f'{cnt}/{total}={cnt/total:.2%}')

最終結(jié)果:

可以看到,我們已經(jīng)得到了404個24點(diǎn)的有效解表達(dá)式。

到此這篇關(guān)于Python實(shí)現(xiàn)快速計(jì)算24點(diǎn)游戲的示例代碼的文章就介紹到這了,更多相關(guān)Python計(jì)算24點(diǎn)游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上

    PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上

    這篇文章主要介紹了PythonWeb項(xiàng)目Django部署在Ubuntu18.04騰訊云主機(jī)上的相關(guān)知識,本文通過代碼加文字說明的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • 深入理解Python 代碼優(yōu)化詳解

    深入理解Python 代碼優(yōu)化詳解

    本文初步探討了 python 常見的性能優(yōu)化技巧以及如何借助工具來定位和分析程序的性能瓶頸,并提供了相關(guān)可以進(jìn)行性能優(yōu)化的工具或語言,希望能夠更相關(guān)人員一些參考。
    2014-10-10
  • Django在pycharm下修改默認(rèn)啟動端口的方法

    Django在pycharm下修改默認(rèn)啟動端口的方法

    今天小編就為大家分享一篇Django在pycharm下修改默認(rèn)啟動端口的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • django自帶的權(quán)限管理Permission用法說明

    django自帶的權(quán)限管理Permission用法說明

    這篇文章主要介紹了django自帶的權(quán)限管理Permission用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • pandas如何使用列表和字典創(chuàng)建?Series

    pandas如何使用列表和字典創(chuàng)建?Series

    這篇文章主要介紹了pandas如何使用列表和字典創(chuàng)建?Series,pandas 是基于NumPy的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,下文我們就來看看文章是怎樣介紹pandas,需要的朋友也可以參考一下
    2021-12-12
  • python實(shí)現(xiàn)中文文本分句的例子

    python實(shí)現(xiàn)中文文本分句的例子

    今天小編就為大家分享一篇python實(shí)現(xiàn)中文文本分句的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python入門教程(三十五)Python中文件的打開

    Python入門教程(三十五)Python中文件的打開

    這篇文章主要介紹了Python入門教程(三十五)Python中文件的打開,在Python中文件的讀取主要是用open()函數(shù),那么open()函數(shù)有哪些方法呢,今天我們就來看一看,需要的朋友可以參考下
    2023-05-05
  • Python三百行代碼實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    Python三百行代碼實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    飛機(jī)大戰(zhàn)想必大家可能玩過微信的這款小游戲,給我的感覺是這款游戲怎么可以做得這么好呢,操作簡單,容易上手,簡直是“老少皆宜”啊,既然這款游戲這么棒,能否自己動手用 Python 來實(shí)現(xiàn)呢?事實(shí)證明是可以的
    2022-09-09
  • 利用Python實(shí)現(xiàn)每日新聞推送

    利用Python實(shí)現(xiàn)每日新聞推送

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫簡單的邏輯,通過調(diào)用API接口實(shí)現(xiàn)每日新聞推送功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • python實(shí)現(xiàn)對doc,txt,xls文檔的讀寫操作

    python實(shí)現(xiàn)對doc,txt,xls文檔的讀寫操作

    這篇文章主要介紹了python實(shí)現(xiàn)對doc,txt,xls文檔的讀寫操作,正如標(biāo)題所見,文章包括三個部分python實(shí)現(xiàn)對doc文檔的讀取、python實(shí)現(xiàn)對txt文檔的讀取和python實(shí)現(xiàn)對xls表格的讀取,需要的朋友可以參考一下
    2022-04-04

最新評論

灌云县| 黄大仙区| 买车| 永德县| 修武县| 黔西县| 开阳县| 吉水县| 象山县| 渝中区| 萨嘎县| 光泽县| 壶关县| 南充市| 甘南县| 平凉市| 嘉禾县| 五寨县| 布拖县| 田林县| 诏安县| 屏东市| 大厂| 普洱| 涞水县| 芒康县| 呼图壁县| 泸州市| 新源县| 宝山区| 广丰县| 海口市| 奇台县| 崇州市| 双桥区| 武宣县| 汉阴县| 成安县| 丹棱县| 新邵县| 肥东县|