爱美容
当前位置: 首页 美容百科

可爱的小姐姐吃鸡大作战(和小姐姐一起玩24点游戏)

时间:2023-05-23 作者: 小编 阅读量: 20 栏目名: 美容百科

周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看。发现老王是真不行啊,那不行,这也不行。为了能让老王在他媳妇面前抬起头来,我决定帮他一把……就用python写了个算24点的玩意,老王对我感激涕零。再遍历四个数字的全排列,对每一组数字而言,遍历所有组合的操作符。代码分析1、eval()函数,接受一个字符串,能让这个字符串当成python代码运行,返回运行的结果。

很多小伙伴会经常私信来问我问题,有些来不及回答,实在抱歉!

本篇有点长!看到最后,给自己一个学习的地方!

周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看。发现老王是真不行啊,那不行,这也不行。

就连个24点都玩不过他媳妇,给他媳妇气的,啥都不能满足,这不能,那也不能。

我坐下来和他媳妇玩了两把,那都是无出其右,把把赢!

我要走的时候,他媳妇还挽留我多玩几把,有意思。

为了能让老王在他媳妇面前抬起头来,我决定帮他一把……就用python写了个算24点的玩意,老王对我感激涕零。

什么是24点

我们先来约定下老王和他媳妇玩的24点规则:给定4个任意数字(0-9),然后通过` ,-,*,/`,将这4个数字计算出24。

小时候玩的都是这个规则,长大了才有根号,才有各种莫名其妙的高级算法,不好玩了,因为我不会。

可能有人会觉得很简单,但是真的简单吗?

比如:

* 8,3,3,3

* 7,3,3,3

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

大致思路

这样想,将四个数字进行全排列,在他们之间添加运算符号。

运算符我们需要进行排列组合,因为只有四个数字,所以只需要三个运算符,而且算法符可能会重复,比如三个都是` `。

再遍历四个数字的全排列,对每一组数字而言,遍历所有组合的操作符。最后将数字和操作符进行拼接运算,就可以得到最终结果了。

演示环境

操作系统:windows10

python版本:python 3.7

代码编辑器:pycharm 2018.2

使用模块:math,itertools, collections.abc

具体代码

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

iertools.permutations 用法演示

from itertools import permutationsdata_list = permutations([1,2,3,4],2)for data in data_list:print(data)

结果显示

(1, 2)(1, 3)(1, 4)(2, 1)(2, 3)(2, 4)(3, 1)(3, 2)(3, 4)(4, 1)(4, 2)(4, 3)

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

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

def get_all_data_sequence(data_iter): return permutations(data_iter)

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

itertools.product 用法演示

结果显示

('A','x')('A','y')('B','x')('B','y')('C','x')('C','y')('D','x')('D','y')------------------------------(0, 0, 0)(0, 0, 1)(0, 1, 0)(0, 1, 1)(1, 0, 0)(1, 0, 1)(1, 1, 0)(1, 1, 1)

`itertools.product`,返回传入所有序列中笛卡尔积的元祖,repeat参数表示传入序列的重复次数。返回的是一个生成器。

那么获取所有的操作运算符就可以通过这个函数来获取了

def get_all_operations_sequence(): operations = [' ','-','*','/'] return product(operations,repeat=3)

3、现在我们已经拿到了所有可能组合的操作符和数字了,接下来就需要对他们进行拼接了。然后执行运算。

这一步操作我们会用到 `itertools.zip_longest()` 和 `itertools.chain.form_iterable()` 函数。

itertools.zip_longest() 用法演示

data = zip_longest([1,2,3,4],['*','-',' '],fillvalue='')for value in data: print(value)

结果显示

(1, '*')(2, '-')(3, ' ')(4, '')

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

itertools.chain.form_iterable() 用法演示

data = zip_longest([1,2,3,4],['*','-',' '],fillvalue='')data_chain = chain.from_iterable(data)for value in data_chain:print(value)

结果显示

1*2-3 4

这里的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种情况。

然后我们对得到的表达式在进行遍历拼接,然后我们再运算表达式。

这样我们就能得出正确的结果了

代码写完了,终于可以开始和媳妇,哦不,老王家的媳妇玩起来了

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

,
    推荐阅读
  • 刺梅果根的功效与作用(刺梅果根的功效与作用有哪些)

    刺梅果根的功效与作用止血刺梅果根入药以后起到止血作用,而且止血效果特别好,它能缩短人体凝血时间,平时人们出现外伤出血时可以把它导碎制成细末,直接外敷在伤处,用药后能尽快止血,而且能防止牲畜感染,加快伤处愈合。收敛止泻刺梅果根还具有它不但能消除人类肠道炎症,还能尽快止泻,能维持人类肠道健康,平时人们出现肠炎,腹泻和痢疾等正式都能直接用它煎水喝,多数患者服用后病情能明显减轻,肠道功能也能尽快恢复正常。

  • 怎么解决汽车轮胎被扎(汽车轮胎被钉子扎了咋办)

    我们的车子在日常行驶过程中,轮胎难免会被异物所扎破。如果汽车轮胎被钉子扎破了,可以试试用应急补胎枪,适用于各种真空胎车型,不需要其他辅助工具,一枪即可完成补胎,不会对汽车轮胎造成伤害。所以,建议跑长途的司机在车上常备补胎器,遇到意外扎胎漏气的情况,应急必备的真空胎补胎工具就派上了用场,它具有方便快捷省力的特点,是开车出行必备的好物。

  • 2022江西城乡居民养老保险业务暂停及恢复办理时间安排

    江西省人力资源和社会保障厅发布公告,宣布2022年8月15日18时-8月25日24时暂停全省城乡居民养老保险业务经办,具体安排详见正文。

  • 叠组词(叠怎么组词)

    以下内容希望对你有帮助!叠组词商圈重叠:不同位置的商店商圈彼此重叠。

  • 瓜子血糖升高吗(1把瓜子等于6碗米饭)

    有些人认为每天吃点瓜子有利于心血管健康,而有的人却持完全相反的看法,认为瓜子里面的热量太高,吃一把等于吃六碗米饭,不仅会导致肥胖,还会损害健康。还有的人认为瓜子的热量高,吃多了会增加脂肪含量,加重肝脏的代谢负担,损害肝脏健康。一般建议,成年人每日的瓜子摄入量不要超过50g,成年人手抓一把的量大概就是这个量。另外在吃完瓜子之后要多喝水,避免上火。

  • 三从四德指的是什么意思(三从四德的意思)

    三从四德指的是什么意思?我们一起去了解并探讨一下这个问题吧!三从四德指的是什么意思三从四德:是中国古代到解放前妇女应有的品德,三从是未嫁从(听从)父、既嫁从(辅助)夫、夫死从(抚养)子,四德指妇德、妇言、妇容、妇功。三从四德是中国古代封建社会用于约束妇女的行为准则与道德规范,“三从”与“四德”的合称。

  • 3dvnand是mlc还是tlc(mlc 3dnand)

    三星手机是三星集团研发的智能手机,三星手机真正开始风靡全球是从A系列开始。A系列最初为折叠手机系列,最早三星SGH、A188、SGH、A288都是经典之作。

  • oppo什么时候收购的一加(OPPO有孙子了)

    据外媒TheMobilelndian爆料,一加正在考虑将旗下Nord产线剥离,成立一个全新的子品牌,经营关系类似于一加和OPPO。Nord有望在近期宣布具体消息,以更加独立的实体面向消费者,只在某些重大场合使用“一加”品牌前缀,证明与母公司没有完全剥离。如果以上消息得到证实,欧加集团将成为最大赢家,旗下共有OPPO、一加、realme、Nord四大品牌产线“儿孙绕膝”。

  • 土味情话大全撩男生(土味情话集锦)

    女:那你已经喜欢上70%的我了。大象的鼻子,熊猫的眼圈,鸟儿的翅膀,蜗牛的壳,我的你。如果你前女友和现女友同时掉到水里,我可以做你女朋友吗?

  • 我是小小营养师教案大班(幼儿园小小营养师教案)

    引导幼儿进行猜测。长期食用还会导致肥胖、营养不良的现象,所以我们应该尽量少吃。活动中,教师可以了解食物金字塔的含义,尝试科学配餐等方式达成教学目标。2.尝试根据“食物金字塔”设计搭配科学合理的营养午餐方案。