前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让Python算24点,一点也不难!

让Python算24点,一点也不难!

作者头像
不可言诉的深渊
发布2019-07-26 17:11:58
1.3K0
发布2019-07-26 17:11:58
举报
文章被收录于专栏:Python机器学习算法说书人

昨天做了一个聊天客户端,今天我们来玩一个游戏放松一下,这个游戏就是众所周知的24点!

24点是一个棋牌类益智游戏,要求四个数字运算结果等于二十四,一起来玩玩吧!这个游戏用扑克牌更容易来开展。拿一副牌,抽去大小王后(初练也可以把J/Q/K也拿去),剩下1~10这40张牌(以下用1代替A)。任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号,高级玩家也可用乘方开方运算)把牌面上的数算成24。每张牌必须且只能用一次。如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24。

既然规则已经有了,那么我就来阐述一下具体的算法:(1)输入四个数;(2)给出这四个数的全排列;(3)因为有四个数,所以运算符只有三个,给出运算符的所有组合;(4)将数和运算符拼接成表达式;(5)找出所有加括号的可能;(6)暴力破解,每一种都试一下;(7)输出结果。

在编写代码之前,还有一些细节需要考虑:(1)给出,或者遍历4个数的全排列如何实现?有些人会想到自己手动实现一个排列树,完全没这个必要,直接使用itertools模块中的permutations类即可。这个类的实例就是一个迭代器,在实例化的时候给一个或者两个参数,第一个参数一定要是可迭代对象,第二个参数是几,就表示从第一个参数中选出几个来排列,如果是全排列,第二个参数可以不写。(2)运算符的所有组合该如何寻找?有些人会想到手动实现子集树,还是没必要,用生成器表达式就可以生成所有组合。(3)最后还有很重要的一个细节问题,既然运算符中有除,那么就应该考虑到并通过try/except排除除0错误!

既然细节问题也都解决的差不多了,下面直接给出完整的源代码,如图所示。

我来解释一下这一段代码:首先是从itertools模块中导入permutations类,然后定义一个存放用户输入的四个数的一个列表num。下面一个for就是循环四次,每次都要求输入一个数,然后把这个数添加到num中。然后就是遍历四个数全排列的所有可能,i 表示其中一种可能。同时使用另一个for遍历运算符的所有组合,j 表示其中一种组合。然后就是根据 i 和 j 创建一个列表expression,这个列表的每一个元素就是当前的 i 和 j 以及括号拼接的表达式的雏形(后面只要使用字符串实例的join方法就可以拼接成字符串表达式),同时这里也暗示了加括号的所有可能。还有最后一个for循环,这个for是用来遍历expression列表,然后再每次遍历的过程中都要使用try/except来排除除0错误。在没有发生异常的情况下,判断字符串表达式的值是否等于24,如果等于,我们就输出表达式;如果不等于,就什么都不做。

接着附上运行结果,如图所示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档