python算24点穷举法_关于24点去重的算法?

=== 4月12日更新 ===

=== 先给结论吧 ===

花了近一周时间用JavaScript完成了24点去重算法,源码提交到了github上:auntyellow/24 ,可以在线试:gives you all dissimilar solutions.

在1到13范围内的四数组合中,不重复解最多的组合是2、4、8、10:

10 + 8 + 4 + 2 = 24

(10 - 4) × 8 ÷ 2 = 24

(10 × 4 + 8) ÷ 2 = 24

((10 + 2) × 8 ÷ 4 = 24

10 × 2 + 8 - 4 = 24

(10 - 2) × 4 - 8 = 24

8 × 4 - 10 + 2 = 24

(8 ÷ 4 + 10) × 2 = 24

(8 × 2 - 10) × 4 = 24

(10 - 8 ÷ 2)) × 4 = 24

10 × 4 - 8 × 2 = 24

只能用分数来解的(16个,这里不给答案了,有兴趣可以自己练练):

1, 3, 4, 6

1, 4, 5, 6 (这题居然有两解,都必须用分数的)

1, 5, 5, 5

1, 6, 6, 8

1, 8, 12, 12

2, 2, 11, 11

2, 2, 13, 13

2, 3, 5, 12

2, 4, 10, 10

2, 5, 5, 10

2, 7, 7, 10

3, 3, 7, 7

3, 3, 8, 8

4, 4, 7, 7

5, 5, 7, 11

5, 7, 7, 11

其他有难度的,就是中间过程必须有大数的(大于36就很难一下子想到了)(像a × b - a × c = 24这种形式,比如10、12、12、12,其实并没有太大难度,就没有列进去):

1, 7, 13, 13

6, 12, 12, 13

1, 6, 11, 13

6, 11, 12, 12

5, 10, 10, 13

1, 5, 11, 11

5, 10, 10, 11

4, 8, 8, 13

4, 4, 10, 10

4, 8, 8, 11

6, 9, 9, 10

3, 8, 8, 10

3, 5, 7, 13

3, 6, 6, 11

1, 2, 7, 7

5, 8, 9, 13

5, 9, 10, 11

4, 7, 11, 13

4, 9, 11, 11

4, 10, 10, 11

6, 7, 7, 11

3, 5, 8, 13

5, 5, 8, 11

2, 3, 13, 13

还找到一个难的:3、7、9、13,它有两种解法,一种用到了分数,一种有大数。

为了验证这些结论,还是查到了 @常成 那边,包括 理论 - 24理论 解决二十四点 (我的算法跟这里相当接近了)、所有独立解 - 24理论 解决二十四点 (解法最多的牌型确实有11个解),需要分数的解 - 24理论 解决二十四点 (确实有16个牌型),看来程序是没太大问题了。

=== 然后说说算法 ===

参考了本题 小于0 的回答,还有 24点算法,如何给出所有不同的答案 - 萝卜的回答 - SegmentFault ,总之就是列出所有不等价表达式,例如 (( a + b ) * c) / d 和 (( b + a) * c ) / d 是等价的,需要去重。

虽然是重复在做很多人以前做过的工作,但还是有些自认为别出心裁的思路,因为并没从代数形式上做分析,而是通过试数的办法做的,试的是π、e、lnπ和arctan e这四个超越数,对近似值做比较(浮点数运算总是有误差的)来判断两个表达式是否等价。(我把近似度设定在1e-6其实算是碰巧蒙对了,SegmentFault的萝卜指出lnπ/(e + π/arctan(e))和π/e - lnπ/arctan(e)只相差7.9e-6,如果把近似度再提高1个数量级,结果可能就不对了。)

5种括号型(((oxo)xo)xo、(ox(oxo))xo、(oxo)x(oxo)、ox((oxo)xo)、ox(ox(oxo)),其中o代表数字,x代表运算符),4个数一共有24种排列,3个符号一共有64种排列,总共需要“试数”的表达式总共有7680个,在这些表达式中找出了1170种不等价的,也和网上能找到的资料相吻合,例如 小于0 给我推荐的 A140606 - OEIS 。

后来发现,仅仅用这1170个表达式是不够的,还要考虑以下14种牌型:

a, a, b, c // 两个相同的数可以交换,也可以抵消

a, a, b, b

a, a, a, b

a, a, a, a

1, a, b, c // 1可以舍去

1, a, a, b

1, a, a, a

1, 1, a, b

1, 1, a, a

1, 1, 1, a

2, 2, a, b // 2 + 2 = 2 × 2,这个算重复解应该说得过去

2, 2, a, a

1, 2, 2, a

2, a, a, b // 2 × a - a = (a + a) ÷ 2,这个居然被我算成重复解了!

另外还有,a、a'(=a+1)、b、c这种牌型,需要把(a'-a)参与乘除运算的解法排除掉,然后单独算b+c、b*c有没有可能等于24。

所以程序里绝大部分逻辑都是在判断:牌型到底属于上面列出来的15种当中的哪一种,写得相当啰嗦。

另外还有一些小问题,比如:1、1、5、5,只给出了一种解,因为对牌型1、1、a、a组成的表达式来说, (a+1)(a-1)和a*a-1*1是等价的;

没有考虑4/2和4-2等价的问题,例如2、4、6、6,(6-(4-2))*6和(6-4/2)*6被认为是两个不等价的解(凭什么2+2和2*2等价,但4-2和4/2不等价?)

当2作为中间步骤时,没考虑2+2和2*2的等价,还拿2、4、6、6说事,(6-4+2)*6和(6-4)*2*6是不等价的解(写到这里我真后悔把2+2和2*2算做等价了)

仔细想想,还真不能轻易认为2+2=2*2、4-2=4/2是等价解法,要是真这么算的话,那么我们可以写出:

(6-4/2)*6 = (6-(4-2))*6 = (6-4+2)*6 = (6-4)*2*6

显然每个等号左右两边都是等价的。但要说最左边的和最右边的是重复的解法,那又说不过去了。

看似很简单的问题,本以为可以花半天时间搞定的,结果编码、测试、验证、优化一系列过程居然花了1周的时间,再次印证了我的盲目乐观 :-(

=== 更早的回答 ===

我在SegmentFault上提了一个相似的问题,问完才发现知乎上已经有了。很快就有人给出漂亮的解答了:24点算法,如何给出所有不同的答案 - 萝卜的回答 - SegmentFault ,起初答题者思路跟 小于0 的回答类似,后来发现穷举太麻烦,就改用符号代数,在Mathimatica里用10余行代码搞定了,真让我吃惊。

另外,对于重复解的定义,还是有挺大争论的,比如我认为2x2和2+2应该算是雷同的,但很多人并不认同。

转载一下:

Clear[game24]game24[input_List,result_:24]:=Block[{add,sub,mul,div},With[{oprules={add->Plus,sub->Subtract,mul->Times,div->Divide},specifics={div[x_,1]:>x,mul[x_,1]:>x,mul[1,x_]:>x,add[2,2]->mul[2,2]}},Map[RightComposition[Hold,ReplaceAll[oprules],ToString[#,InputForm]&,StringDelete[{"Hold[","]"}],StringReplace[{"*"->"\[Times]","/"->"\[Divide]"}]],Union[Select[result==(#/.oprules)&]@Groupings[Permutations@input,{add,sub,mul,div}->2],SameTest->(0===Simplify[sub[#1,#2]//.specifics/.Prepend[oprules,k_Integer:>ToString[k]]]&)]]]]用符号add、sub、mul、div分别对应加减乘除四则运算,构建二叉树代表算式。Groupings函数生成了所有可能的表达式二叉树。

Select筛选出计算结果符合要求的。

Union负责除去雷同的算式。它的SameTest选项计算两个代数式的差化简后是否为0。注意这里通过把数字转为字符进行“符号化”了,而且对数字1、2进行了特殊处理(specifics)。

最后Map负责把每个算式转成字符串输出。

测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么当今的企业都需要人工智能战略?

来源:腾股创投概要:人工智能(AI)从根本上改变了所有行业的企业的运营(包括制造业,医疗健康,信息技术和运输业)。今后5年,会有一些标普500强CEO 后悔没有早点考虑自己的 A…

java邮箱_java发送邮件(qq邮箱)

完整的示例代码:package cn.sw.study.common.test;import javax.mail.Message;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.util.Date;import java.ut…

昆虫大脑帮助AI解决导航难题

原作者:SAKYASINGHADASGUPTA, LEAPMIND INC译者:彭婷概要:无人机和其他自主机器人需要通过移动或其他有效的方案来解决现实生活中的问题,而这些问题有的小到平常的包裹运输,有的大到紧急搜索和救援任务。无人机和其他自…

DeepMind发布《星际争霸 II》深度学习环境

来源:AI 研习社概要:上个月,DeepMind和暴雪终于开源了《星际争霸II 》的机器学习平台。本文介绍了基于星际争霸II游戏的强化学习环境SC2LE(《星际争霸II 》学习环境)。StarCraft II: A New Challenge for Reinforcemen…

java arraylist .get_Java ArrayList get()方法

Java ArrayList get()方法java.util.ArrayList.get(int index) 方法返回在ArrayList中的指定位置的元素。1 语法public E get(int index)2 参数index:要返回的元素的索引。3 返回值返回ArrayList中指定位置的元素。4 示例package com.yiidian;/*** 一点教程网&#…

中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇

来源:北航新闻网、机器人大讲堂概要:通过这三项关键技术,我们成功实现了机器人样机能够像真正的䲟鱼一样牢牢吸附在物体表面,并且通过内部鳍片的主动抬起运动显著增大摩擦力。重磅惊喜,北京时间9月21日,国际…

java 控制台输入字符串_Java控制台输入字符串及字符串比较

需求描述:茵茵很喜欢研究车牌号码,从车牌号码上可以看出号码注册的早晚,据研究发现,车牌号码是按字典序发放的,现在她收集了很多车牌号码,请你设计程序帮她判断注册较早的号码。车牌号码由5个字母或数字组成…

DARPA:我们需要一种新型的芯片技术来确保人工智能的长足发展

原文作者:Dom Galeon译者:李凌概要:专家们普遍认为在21世纪20年代摩尔定律将黯然失色。同时,人工智能正在接受的测试要求他们有更强大的处理能力——接近于人脑的处理能力。简介上周三,美国国防部高级研究计划局&#…

java 反射.问题_Java知识点总结(反射-反射机制性能问题)

Java知识点总结(反射-反射机制性能问题)(Java知识点总结)[Java, 反射]性能相关注意点:setAccessible启用和禁用访问安全检查的开关,值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。__并不…

前沿|揭开黑箱:希伯来大学计算机科学教授提出「信息瓶颈」

来源:全球人工智能概要:像大脑一样,深度神经网络也有很多层神经元。当神经元被激活时,它会发出信号,连接上面一层的神经元。如今「深度神经网络」已经学会对话、驾驶汽车、打视频游戏、玩围棋、绘画并辅助科研&#xf…

华为与英特尔开展5G互操作性测试

来源:华为概要:C-Band被认为是首批全球协同频谱之一,将提供5G的基础覆盖和带宽,是5G最主要的频段,也是全球最可能首商用的频段之一。华为与英特尔宣布启动基于3GPP标准的5G新空口互操作性测试(IODT&#xf…

java手机网站开发工具_制作网站常用的网页开发工具有哪些

我们要想制作好网站其实是离不开网站代码的HTML,我们在制作网站的时候是需要用到一些常用的网页开发工具,才能完成我们网页的编写,那么,你知道制作网站常用的网页开发工具有哪些吗?不清楚的话,下面小编和你说一说吧!一…

Natural 自然语言处理(NLP)「全解析」

原文来源: 机器人圈概要:在自然语言处理方面的研究已经延续了五十多年,而随着计算机的兴起,它的发展也早已超出了语言学的范畴。提起AI,你可能会不假思索的想到自然语言处理、人脸识别、无人驾驶等。那么,你…

java web swing 教程_好程序员Java教程解读什么是swing

原标题:好程序员Java教程解读什么是swing好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用。运行swing程序要求用户电脑上有java环境,这一点不太现实也不方便。现在的java主要以web方向为主&…

大脑神经细胞也有老熟人

来源:科学网概要:观察者在没注意到熟悉的画面时,相应的神经元也会发射。但神经反应的强度和时间上与看到时的有明显差异。当人们看到认识的人图片时,比如著名的网球运动员Roger Federer或女演员Halle Berry,特定的细胞…

java把小写变大写_用java实现人民币小写变大写的方法

用java语言可以实现人民币小写转换为大写吗?如何实现呢?下面常见的用java实现人民币小写变大写的方法可以说是最精简的了,希望大家可以学习下。这里介绍一个通过取余的办法来实现将人民币小写转换为大写形式,个人认为比TTS上面的答…

从生成对抗网络到更自动化的人工智能

来源:中国计算机协会作者:黄鹤 王长虎概要:“What I cannot create, I do not understand.” 这是著名物理学家费曼的一句名言。把这句话放在人工智能领域,可以理解为:要想让机器真正理解某样东西,就得让…

jsp解决mysql乱码_解决mysql+jsp出现乱码的问题

解决mysqljsp出现乱码的问题发布时间:2020-07-11 14:39:04来源:亿速云阅读:65作者:清晨这篇文章主要介绍解决mysqljsp出现乱码的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一…

百度人工智能

来源:199IT互联网数据中心概要:人工智能的发展运用到生活的各个方面。

java9 揭秘 jlink_初试Java9

原标题:初试Java9Java 9 正式发布了JDK 9(http://openjdk.java.net/projects/jdk9/)有不少重要或是有意思的新特性,这里简单介绍下我的了解与尝试抛砖引玉下载oracle 官网下载即可。(http://www.oracle.com/technetwork/java/javase/downloads/jdk9-down…