点击上方“码农突围”,马上关注,每天早上8:50准时推送真爱,请置顶或星标周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看。发现老王是真不行啊,那不行,这也不行。
就连个24点都玩不过他媳妇,给他媳妇气的,啥都不能满足,这不能,那也不能。
我坐下来和他媳妇玩了两把,那都是无出其右,把把赢!
我要走的时候,他媳妇还挽留我多玩几把,有意思。为了能让老王在他媳妇面前抬起头来,我决定帮他一把……就用python写了个算24点的玩意,老王对我感激涕零。

什么是24点
我们先来约定下老王和他媳妇玩的24点规则:给定4个任意数字(0-9),然后通过`+,-,*,/`,将这4个数字计算出24。小时候玩的都是这个规则,长大了才有根号,才有各种莫名其妙的高级算法,不好玩了,因为我不会。可能有人会觉得很简单,但是真的简单吗?

比如:* 8,3,3,3* 7,3,3,3

你能一眼看出来答案吗?好像真的可以……

大致思路这样想,将四个数字进行全排列,在他们之间添加运算符号。运算符我们需要进行排列组合,因为只有四个数字,所以只需要三个运算符,而且算法符可能会重复,比如三个都是`+`。再遍历四个数字的全排列,对每一组数字而言,遍历所有组合的操作符。最后将数字和操作符进行拼接运算,就可以得到最终结果了。

演示环境操作系统:windows10python版本:python 3.7代码编辑器:pycharm 2018.2使用模块:math,itertools, collections.abc

具体代码1、首先我们对所有数字进行去全排列,这里我们使用 itertools.permutations 来帮助我们完成。

iertools.permutations 用法演示

结果显示

permutations 第一个参数是接收一个课迭代的对象,第二个参数指定每次排列时从课迭代对象中选着几个字符进行排列。也可以不传入第二个参数,那么默认就是可迭代对象的长度。并且返回一个生成器。

所以我们需要对所有数字进行全排列,就可以像下面这样写:

2、然后我们需要拿到所有的操作运算符的所有组合方式。这里我们就会使用 `itertools.product` 函数了。

itertools.product 用法演示

结果显示

`itertools.product`,返回传入所有序列中笛卡尔积的元祖,repeat参数表示传入序列的重复次数。返回的是一个生成器。那么获取所有的操作运算符就可以通过这个函数来获取了

3、现在我们已经拿到了所有可能组合的操作符和数字了,接下来就需要对他们进行拼接了。然后执行运算。
这一步操作我们会用到 `itertools.zip_longest()` 和 `itertools.chain.form_iterable()` 函数。

itertools.zip_longest() 用法演示

结果显示

zip_longest() 其实和 python 内置的 zip() 函数用法差不多,只是 zip_longest 是以最长的一个序列为基准,缺失值就使用 `fillvalue` 参数的值进行填充

itertools.chain.form_iterable() 用法演示

结果显示

这里的data是什么样的大家知道了吧,然后我们将data传入 chain.form_iterable() 中,它就能将里面的值依次拿出来。

了解了这两个函数之后,那么我们就可以开始拼接数字和操作运算符了。

代码分析1、eval() 函数,接受一个字符串,能让这个字符串当成 python 代码运行,返回运行的结果。
2、math.isclose():为什么这里需要使用 math.isclose() ,而不是直接使用`==`运算符呢?这是因为最后算出来的表达式可能有精度问题,例如23.9...或者24.0...等数字,所以我们就需要使用math.isclose()函数来帮助我们判断两个数字是否相等了,这个函数就有一个精度范围。这样出现上面情况的时候,我们也能匹配得到条件了。我们运行代码,然后测试代码是否能达到我们的需求。首先我们测试1,2,3,4四个数字,程序出来了结果 `1*2*3*4` 24看来好像我们写的代码是正确的

我们再来测试一组数据8,8,3,3.嗯?我们并没有得到结果?这四个数字不能运算出24吗?`8 / ( 3 - 8 / 3 )` 这样组合可以吧,为什么没有算出来这种结果呢?

这是因为我们没有考虑括号的原因。括号是可以改变运算优先级的。所以我们得把括号考虑进去。

那么想一下括号最多可以有几个呢?怎样给我们的表达式添加括号呢?

在4个数字的运算中,括号最多只能有三个。并且,在这里,我们使用一种简单的方法添加括号,我们把所有可能出现括号的情况全部罗列出来,然后在将得到的运算表达式拼接进去。可能大家会觉得罗列出所有括号出现的情况不现实,因为有很多情况其实不然,当我们去罗列的时候,你就会发现,只有11种情况。

然后我们对得到的表达式在进行遍历拼接,然后我们再运算表达式。这样我们就能得出正确的结果了代码写完了,终于可以开始和媳妇,哦不,老王家的媳妇玩起来了更多爬虫,关注公号,后台回复:24点,获取全套代码。:

周末隔壁老王和媳妇玩24点,我忍不住用 Python...相关推荐

  1. 在昨天夜黑风高的晚上,我偷了隔壁老王的Python入门课件,由浅入深堪称完美!

    隔壁老王是一个资深码农,就业教育事业的秃顶之才 昨天我下楼打酱油,看他迎面走来,满目春光 我好奇的问道:老王,有什么好事,隔壁小花叫你上门了吗? 老王:秘密!! 我心想:哎呦~不错啊 半晚之时,连猫狗 ...

  2. OMG,隔壁老王竟然是个GEEK !

    每天除了吃饭,基本就是坐在电脑前写程序,我就是传说中真正的码农.你一定觉得我的生活很枯燥,但我不觉得,几行代码就能帮助一个APP实现某些功能,几行代码就能让素不相识的人聊起天,我觉得非常有成就感. - ...

  3. 厉害了隔壁老王,带你入坑腾讯联机对战引擎!

    前文导读: <联机对战!隔壁老王都入坑了,你还在等啥?> 前面我们介绍了『开心鼠吃象』这个游戏的玩法,以及对战引擎的注册开通,这次给大家介绍MGOBE实战操作! 如果你对MGOBE还不太了 ...

  4. 隔壁老王的iptables防火墙

    防隔壁老王的iptables防火墙 一.Linuux包过滤防火墙概述 1.1防火墙的分类 1.2Linux防火墙 1.3Linux包过滤的工作层次 1.3iptables的表.链结构 1.3.1规则表 ...

  5. 凭借这四招,别说隔壁老王,神也蹭不到你家Wifi!

    无wifi何以平天下,出门在外,用手机蹭别人的Wifi热点,那叫"江湖救急",我睁只眼闭只眼也就算了.但是,隔壁的老王天天蹭我们家Wifi是怎么回事? 一.别人是怎么蹭上你的Wif ...

  6. 隔壁老王的女朋友都能学会的ELK实战之elasticsearch

    文章目录 准备工作 本文所用操作系统: 系统详细信息: 系统内核: 系统版本: 系统内存 本文所用ELK软件版本: 软件下载地址: 将ELK所需要的软件上传到服务器 新建文件夹xinsz08 上传软件 ...

  7. 到底是不是隔壁老王?责任链模式帮小头爸爸洗绿

    目的 在发送请求的类和最终处理的类之间进行解耦 例子代码 小伙伴们都看过 大头儿子小头爸爸 么(大手牵小手, 走路不怕滑~), 当初纯洁的我怎么也没想到小头爸爸的绿帽子这么鲜艳 [外链图片转存失败,源 ...

  8. 隔壁老王都知道的用C#+SQL Server 仓库管理系统设计和实现【建议收藏,不然看着看着就不见了】

    隔壁老王都知道的用C#+SQL Server 仓库管理系统设计和实现[建议收藏,不然看着看着就不见了]

  9. python教学小说03 好卷,隔壁老王也来学python了

    猫慵懒的声音蹦到小柯脑中. "我来自其他星球,就是你梦中的那个世界.嗯,怎么说呢,那是个和地球差不多的星球,里面除了人类,还有兽人和机器人." "我们星球的人类借助上古语 ...

最新文章

  1. 没有好看的 Terminal 怎么能够快乐地写代码
  2. what should we learn from Magnetite?
  3. QT 4.8.5支持电容触摸屏 和 鼠标
  4. Gartner发布2021年数字商务技术成熟度曲线,重点关注四项技术
  5. 数据太大导致oracle数据库连接关闭,ORACLE异常关闭后导致数据库报错无法连接问题解决办法-Oracle...
  6. SVN的配置与使用方法
  7. Halcon自定义直线卡尺rake
  8. php tp5 model 文件,tp5model的新增
  9. mysql 矩表_mysql表某相同值最近一次出现的间距
  10. java船_Java-货船
  11. 数据挖掘原理与实践学习(3)
  12. Verilog三段式状态机描述
  13. Photoshop cc2019 破解教程
  14. u盘写保护+计算机管理,U盘写保护的解决方法
  15. [Python]代码重复率查找工具Clone Digger
  16. 想给我们的线下分享会起个名字,求建议!
  17. Eureka Client 源码解析
  18. 瑞星4月2日安全综述:网页挂马攻击严重
  19. 2018第5周价值信息总汇
  20. 现代金融业务--计算题合集(自用,quiz的解答瞎写的)

热门文章

  1. android notification 监听,如何监听Notification的点击事件
  2. Windows 7 开始菜单中没有运行,怎么让运行显示出来?
  3. 4款【新概念APP】对比+免费下载
  4. wps斜杠日期格式_运用WPS处理日期数据格式的方法
  5. android 余额宝,Android 仿支付宝中的余额宝收益进度条
  6. 用python写生日快乐说说_祝自己生日快乐说说
  7. python修复老照片_三行python代码还原老照片,开启超清会员模式!
  8. 如何在Google Chrome浏览器中更改主页
  9. Android官方ADB
  10. 给最爱的人最好的礼物——味芙西饼