24 点游戏规则

有4个范围在 [1,9] 的数字,通过「加、减、乘、除」四则运算能够获得24,认为有解。

4个范围在 [1,9] 的数字能够产生495种可能,其中404中组合情况都是有解的,有解概率高达81.62%。

下面我们用python来验证它,首先计算组合数:

from scipy.special import combcomb(9, 4, repetition=True)
495.0

可以看到python计算出9个数字有重复的组合情况数是495。

下面我们需要一个方法,判断4个数字能否组合成为24点,这里我采用回溯算法进行计算。

回溯算法计算思路

首先从4个数字中选择2个数字,然后再选择一种运算操作,然后用得到的结果取代选出的2个数字。然后在剩下的3个数字中,进行同样的操作。依次类推,最终计算到只剩一个数字,看结果是否为24即可。

开始编码:

from operator import add, mul, sub, truediv
from itertools import permutations, combinations_with_replacementops = [add, mul, sub, truediv]def judgePoint24(nums) -> bool:if not nums:return Falsen = len(nums)if n == 1:return round(nums[0], 3) == 24for i, j in permutations(range(n), 2):# 选2个数字x, y = nums[i], nums[j]# 选择加减乘除 4 种运算操作之一,用得到的结果取代选出的 2 个数字# 先添加未选择的数字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:# 加法和乘法满足交换律,跳过第二种顺序continueif k == 3 and round(y, 3) == 0:# 除法运算除数不能为0continuenewNums.append(ops[k](x, y))if judgePoint24(newNums):return TruenewNums.pop()return False

然后我们遍历所有的组合进行判断:

from scipy.special import combtotal = 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%}')

最终一秒内计算出结果:

生成表达式

下面我们加大难度,要求在求解时,能够同时返回可行的表达式。暴力遍历固然可以实现,但是耗时太长,能否在这种回溯算法的基础上实现呢?

我的思路是加个变量记录每次的选择,最终再通过一定的技巧进行还原,最终编码:

from operator import add, mul, sub, truediv
from itertools import permutations, combinations_with_replacement
from collections import defaultdictdef judgePoint24(nums) -> bool:ops = [add, mul, sub, truediv]op_char = "+*-/"record = []def solve(nums) -> bool:if not nums:return Falsen = len(nums)if n == 1:return round(nums[0], 3) == 24for i, j in permutations(range(n), 2):# 选2个数字x, y = nums[i], nums[j]newNums = []# 选择加减乘除 4 种运算操作之一,用得到的结果取代选出的 2 个数字# 先添加未选择的数字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:# 加法和乘法满足交换律,跳过第二种顺序continueif k == 3 and round(y, 3) == 0:# 除法运算除数不能为0continuev = ops[k](x, y)newNums.append(v)record.append(([x, y], op_char[k], v))if solve(newNums):return TruenewNums.pop()record.pop()return Falseflag = 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()+")"r = f"{ns[0]}{op}{ns[1]}"cache[v].append(r)return flag, r+"=24"

然后开始遍历:

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

最终结果:

可以看到,我们已经得到了404个24点的有效解表达式。

Python快速计算24点游戏并获取表达式相关推荐

  1. 计算24点游戏精化算法剖析

    很多人都玩过这个数学味儿很浓的益智游戏:抽出4张扑克牌,牌上的点数代表四个数字,花牌视为1点(有的把J.Q.K分别视为11.12.13点),玩家中谁最先运用加减乘除四则运算,由这四个数计算出24,谁就 ...

  2. Python快速计算函数耗时timeit

    文章目录 问题描述 解决方案 魔法命令 `%%timeit` timeit 模块 参考文献 问题描述 Python 快速计算函数耗时 import timedef f():time.sleep(2) ...

  3. python_用python计算24点游戏

    24点的游戏大家都玩过,这次我们用python来算出四张牌的计算24的方法 def calculates(number, n, result):if n == 1:if number[0] == re ...

  4. python游戏开发步骤_详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  5. 详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  6. Python快速计算Fibonacci数列中第n项的方法

    from time import time from functools import lru_cache def fibo1(n):     '''递归法'''     if n in (1, 2) ...

  7. python经典程序-python经典趣味24点游戏程序设计

    一.游戏玩法介绍: 24点游戏是儿时玩的主要益智类游戏之一,玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24.例如,2,3,4,6,通过( ( ( 4 + 6 ) - ...

  8. 基于Python制作的24点游戏生成器

    资源下载地址:https://download.csdn.net/download/sheziqiong/85796930 资源下载地址:https://download.csdn.net/downl ...

  9. html 计算24点游戏,0048 JavaScript编程实现算24点游戏

    原标题:0048 JavaScript编程实现算24点游戏 上节课在网页上使用Java实现了根据输入日期计算星座的程序. 这节课来做一个算24点游戏,主要是练习使用Java来控制网页元素. 程序设计思 ...

最新文章

  1. 区块链开发公司能做什么?对企业未来市场有何帮助?
  2. 什么?终止一个容器竟然用了 10 秒钟,这不能忍!
  3. 客户端连ORACLE
  4. 微信小程序~自定义属性设置和获取(data-)
  5. iOS- 关于AVAudioSession的使用——后台播放音乐
  6. 解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码
  7. leetcode 220. 存在重复元素 III(排序)
  8. 公司盘点员工,不上班的员工要给钱吗?
  9. AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止)
  10. Replication的犄角旮旯(四)--关于事务复制的监控
  11. PEP8 Python 编码规范
  12. 阿里云搭建 ftp 服务器
  13. 第六周作业-需求建模
  14. 道士后期时的技能运用有哪些
  15. data-toggle=dropdown/data-target/data-dismiss/data-backdrop/data-spy/data-slide/data-source是什么意思?
  16. Python自动化:批量合并某个文件夹内子文件夹的所有Excel,并新增两列分别备注文件路径和子sheet名
  17. ppt画图输出pdf
  18. 不懂编程?节点包来凑——Dynamo常用节点包推荐(下)
  19. 钱多多软件冲刺第一阶段典型用户和场景
  20. Xunsearch迅搜项目实战经验

热门文章

  1. 关系数据库的简单概念和简单操作
  2. 关于将px转换为vw vh的解决方案
  3. Unity实战篇:Buff系统设计(二:具体代码和实战使用)
  4. 在成长的路上,我们都是孤独的赶路人!
  5. js获取url参数中文乱码问题
  6. 电脑网络连接受限的解决方法
  7. 什么叫同时处理两个ajax请求?
  8. 国内外程序员的薪资如何?年薪最高218万!人人都想当程序员
  9. 万字长文手把手教你搭建家庭私有云
  10. android button 图片 大小设置,android 中怎么控制ImageButton 上的图片与按钮大小的匹配...