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

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

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

周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩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”即可领取。

,
    推荐阅读
  • 张铎妈妈令人窒息(张铎妈妈想要无片酬演戏)

    近日,家庭伦理类综艺节目《婆婆和妈妈》正在持续热播中,该节目从播出到现在也有一段时间了,马上就要到结尾阶段了。程莉莎选择了花束,没想到陈松伶的婆婆和杨子也是花束,这个新的家庭也是很有趣了。程莉莎直接将杨子当作自己的老公一样使唤,杨子本来想用对待黄圣依的方式来对待程莉莎,但是发现压根就不管用,直接就被程莉莎给碾压了。

  • 入门眼线教程(画眼线的方法)

    入门眼线教程棉签按住上眼皮,会比用手指的接触感更干爽,接触眼皮面积也会很小。在同一个点,左右反复描绘几次,直至完成整条内眼线,具体可看图中示范。外眼线的部分不需要太夸张,用棉签按住眼尾轻轻向外拉,用眼线笔贴近睫毛根部,画一条细细的眼线即可。眼尾的部分稍稍向外平拉,眼尾钝一些,可以瞎按的整个眼更自然。划过眼线之后,用棉棒在沿线位置按压一下,用来吸走多余油分,也可以防止眼线脱妆。

  • 梅艳芳帅气角色(几千人中被选中饰演梅艳芳)

    距离传奇巨星梅艳芳逝世十八年时,这部关于她的传记电影《梅艳芳》终于来了,该片将于11月12日上映。备受瞩目的梅艳芳饰演者,是模特出道、从几千人中拿到角色的新人演员王丹妮。遗憾的是,今年3月廖启智因病去世,没能赶上“徒弟”王丹妮的出师。《梅艳芳》不仅是传记片,从头到尾还穿插了大量的歌舞,这给王丹妮带来了又一挑战。经过半年的特训,王丹妮已经分不清哪部分是自己,哪部分是梅艳芳了。

  • 虾线是在背上还是肚子下(虾线到底是在背上还是肚子下)

    以下内容希望对你有帮助!虾线是在背上还是肚子下虾线是虾的消化道,在虾的背部。虾的腹部也有一条线,但是这条线并不是虾的肠道,也不是我们日常生活中所说的虾线。如果想要除掉虾线,这个时候可以准备一个牙签并将它插入虾体内,然后把牙签往上挑直到将虾线挑出来,最后把虾线完整地拽出来。还可以将虾头掰断,将虾头中的内脏挤出来,接着也能将虾线给拉出来。

  • 福特野马哪款车型最好看(福特全新SUV售价5款车型任你选)

    MachE是福特旗下将推出的一款纯电SUV,新车或将定位为紧凑级车型。近日海外媒体曝光了福特全新MachE的车型售价,新车预计将推出5款车型,海外起售价为43,895美元兑,并将于下周即将开幕的2019年洛杉矶车展上正式发布。动力方面,新车将采用纯电形式驱动,并配备前后双电机,最大续航里程可达600km。外观方面,新车前脸采用了封闭式格栅设计,车身侧面呈溜背式造型,车尾与野马跑车车型保持一致。

  • 理睬的意思是什么一个一个字解释(理睬可以怎么解释)

    我们一起去了解并探讨一下这个问题吧!理睬的意思是什么一个一个字解释理睬的意思为对别人言行给以注意并表示态度。理的释义有四个,分别为:物质本身的纹路、层次,客观事物本身的次序,如心理、肌理、条理、事理。自然科学,有时特指“物理学”,如理科、数理化、理疗。按事物本身的规律或依据一定的标准对事物进行加工、处置,如理财、理事、管理、自理、修理、总理。睬的释义为理会、搭理。

  • 九江庐山市春节期间黄码人员核酸检测点

    健康码黄码人员需接受必要的核酸检测、健康监测等措施。请提前报告社区,并在做好防护后再前往以下黄码人员核酸采样点。提交成功后,县区解码专员会在24小时内在线审核,实现网上转码全闭环操作。如还有其他需要解答的问题,请与属地指挥部或社区工作人员联系。

  • 初唐四杰是谁 盛唐四杰是谁

    与四杰同时代的张说在《赠太尉裴公神道碑》中称:“在选曹,见骆宾王、卢照邻、王勃、杨炯”。

  • 牛种类 牛有几种

    牛是我们常见的一种动物,起源于中新世,是由原古鹿类分化的一支混杂而进步的支系,牛的用途有很多,那么牛种类有哪些?乳用品种是生长牛奶和奶制品为主,如荷兰牛。肉用品种是生产牛肉和牛肉制品,如短角牛,海福特牛,安格斯牛等。役用品种主要是用来耕作,如中国的水牛,黄牛等。兼用品种是乳肉兼用、肉役,如西门塔尔牛,丹麦红牛,瑞士褐牛等。