Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mathematica 谜中智 | 奥运五环 数字谜题(谜底)

Mathematica 谜中智 | 奥运五环 数字谜题(谜底)

作者头像
WolframChina
发布于 2018-05-31 02:39:28
发布于 2018-05-31 02:39:28
3.2K0
举报
文章被收录于专栏:WOLFRAMWOLFRAM

奥运五环中的秘密,你找到了吗?

谢谢@翁德平的回答。

共有8组答案,数字按下图位置和顺序摆放。答案分别是:

925461738, 837164529, 941832567, 765238149, 765283194, 491382567, 861743295, 592347168。

解题

使用函数:Permutations,Select, Union, MemberQ, FromDigits, Timing。

方法一:数学思维

本题虽小,但我们也可以探讨一下解题思路,如下从两个层次,数学和算法分别来探讨一下。

先从数学上讲,本题属于离散和组合数学,1-9个数字的全排列,用Wolfram语言可以表示如下。

它们构成了本题全部的数据组合,正确答案肯定在这个范围内。接下来就是我们如何通过定义满足题意条件或规则,来把正确答案从以上的集合中找出来。

根据题意要求,每个环内的数字相加之和相等。再通过观察,我们不难发现,两环相交处中间的数字被用到了两次。其实就是第一个环是由2个数字相加,第二、第三和第四个环是由3个数字相加,第五个环又是由2个数字相加。9个数字中间有4个数字被两侧的环重复利用了,5个中间的数字仅使用了一次。

如下我们来构造一个自定义函数,它的功能就是根据题意分别为每个环的相加之和。

随后,我们将1-9的全排列permutation,代入自定义函数ringSumFunction,来计算环内之和,并将它们中5个环相等的情况挑选出来。如下我们认为5环的环内之和数值相等,因此合并之后长度为1。

结果出来了,共有8组解,而且可以得知,是环内之和为 11,13 和14的情况是正确解。但是具体9个数字的排列顺序目前还不知。没关系,接下来我们根据以上结论,环内之和数相等ringSumEqual,从permutation中把符合的情况都挑选出来。最后用FromDigits将链表在转换为数字形式。

恭喜你!获得了正确的答案。从数学角度而言,这种方法定义了一个数据库,然后通过一定规则或条件,从数据库中搜索找到正确答案。因此这种方法比较简单、直接,当然也便于理解,从数学角度而言是它或许是可以接受的。但是它也存在一个问题,接下来我们进一步讨论。

我们回顾一下之前解题的代码,并且用Timing来测试一下运行时间。

代码4行,倒也不算复杂。但运行时间达到约8秒,这个其实有点差劲了。心理学家曾测试,计算机用户如果等待计算机响应的时间大于5秒,就能明显感觉是在等待。分析一下造成运行时间较长的原因是1-9个数字的全排列permutation实际是一个大数据团。

其实1-9个数字的全排列也就是9的阶乘,数据的量级在36万组,计算量当然也就是36万次了。

离散数学中排列组合问题就是这样,往往是按照指数级别向上增长,看看没几个数字,但组合在一起就是个大谜团。

方法二:算法思维

接下来我们从算法设计的角度,再来讲解一下。之前的方法从算法上讲,属于“蛮力法”或是“暴力法”,也就是让计算机“充分地”去做所有的计算,包括必要的和“不必要”的任务。

同时,根据之前的分析,我们也知道了问题所在,组合数量庞大。那么让我们换个思路,如何降低排列组合数量,提高计算机运行的效率。

通过之前的一轮解题,我们发现其实每个环内数之和也就是从11到14的范围内。那么我们不必把每个数字都排列出来了,而仅仅挑选两环相交的数字numberBetweenRings 生成排列,剩余的数字我们可以通过环内数之和sumRings间接计算而得。

同样地,我们来构造以供由4个环间数字和1个环内数之和作为函数的输入变量,构成的9个数字的链表。

这样构造9个数字链表,可能未必正好是1-9这九个数字,再通过Sort把符合1-9数字情况挑选出来。如下我们假设环内数之和等于11。看一下计算结果,运行时间大幅缩短,达到0.1秒以内。

当然以上计算的其实仅是一种特殊情况,即环内数之和等于11。但仔细想想,其实环内数之和的范围也是极为有限的,它的最小值是1+2=3,它的最大值7+8+9=24,从3到24也就是环内数之和的有效范围。我们再次计算,来获得环内数之和ringSum变量在全部有效范围内的解。

通过Select把空解过滤掉,也用FromDigits将链表在转换为数字形式。

可见,得到了同之前方法相同的正确答案。同样使用4行代码,运行时间明显下降了一个数量级,现在仅需0.8秒了。

其实质是计算量小了一个数量级,目前的组合数仅3千组,再乘以20多种环内数之和的情况。通过我们合理的分析和理解,大幅减少了组合情况,仅计算"最必要"的部分,而将一些简单的冗余计算抛弃。

从8秒降低到0.8秒,运行效率提升一个数量级。使原有明显的等待时间,降低到一种使用者很难发现的等待时间,是实现人机动态和高效交互的基础。

演示


参考文献

[1] F. Wu, "Pandigital Olympic Circles Puzzle", Wolfram Demonstrations Project.

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

本文分享自 WOLFRAM 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mathematica 迷中智 | 奥运五环 数字谜题
█ 本期开始吴飞先生将为大家奉上“Mathematica 迷中智”。谜底将在下周公布,欢迎大家留言评论告诉我们您的答案。积极参与者有可能获得惊喜噢! 吴飞 任职于上海微电子装备(集团)股份有限公司,创新业务主管,计算机仿真和软件开发学科带头人。他从2000年开始学习和使用Mathematica,《Mathematica演示项目笔记》的作者,Wolfram语言的忠实粉丝,Wolfram社区的贡献者之一。 谜题一:奥运五环 数字谜题 引言 Engineers, they like to solve pro
WolframChina
2018/05/31
1.5K0
Mathematica 谜中智 | 趣味象棋 一马平川【谜底篇】
中国象棋是中华民族的文化瑰宝,您找到答案了吗? 谢谢@笙箫默同学积极的参与并分享了他的答案: 代码:http://o8aucf9ny.bkt.clouddn.com/chessCode.png 结果:http://o8aucf9ny.bkt.clouddn.com/chessLnew.gif 谜底 ---- 答案: 正确答案不唯一,且可行解肯定大于等于46种。 方法一: 采用回溯算法 + Warnsdorf 规则的方法,可获得1种答案。当马的初始坐标位置从 {8,1} 开始(即 x=8,y=1;或者说第8
WolframChina
2018/05/31
1.5K0
JavaScript刷LeetCode拿offer-双指针技巧Medium篇
由题意可知,保证所需的最小船数,意味着每一趟尽可能地搭载两个人,并且他们的重量最接近最大重量,以便后续趟次能够组成两个人。
hellocoder2028
2022/11/01
4110
【组合数学】排列组合 ( 两个计数原则、集合排列示例 | 集合排列、圆排列示例 )
分步计数原理对应乘法法则 , 最终结果是 第一步的方案个数 乘以 第二步的方案个数 ;
韩曙亮
2023/03/28
1.2K0
搜索与回溯算法模板及其应用
为了求得问题的解,先选择某一种可能情况向前探索,在探索的过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。
echobingo
2019/06/16
1.3K0
一文学会排列组合
上一篇「一文学会递归解题」一文颇受大家好评,各大号纷纷转载,让笔者颇感欣慰,不过笔者注意到后台有读者有如下反馈
kunge
2019/12/23
1.2K0
一文学会排列组合
刷完欧拉计划中的63道基础题,能学会Rust编程吗?
2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以又开始了Rust的快速入门学习。
江湖安得便相忘
2019/10/15
2.3K0
文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题
在大小为n的集合中,一个k字符串构成一个k排列的概率是1/k!,这是由于排列的总数是k!,而每个字符串被选中的概率是相等的,因此每个字符串构成一个排列的概率是1/k!。
福大大架构师每日一题
2023/06/21
2260
文心一言 VS 讯飞星火 VS chatgpt (41)-- 算法导论5.4 5题
Mathematica 谜中智 | 赏九美图 戏九连环
吴飞 任职于上海微电子装备(集团)股份有限公司,创新业务主管,计算机仿真和软件开发学科带头人。他从2000年开始学习和使用 Mathematica,《Mathematica演示项目笔记》作者,Wolfram 语言的忠实粉丝,Wolfram 社区贡献者之一。 谜题三:赏九美图 戏九连环 引言 谁知此时黛玉不在自己的房中,却在宝玉房中大家解九连环作戏。 — 曹雪芹,《红楼梦》第七回 教学 使用函数: TimelinePlot, BSplineCurv
WolframChina
2018/05/31
1.3K0
【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
不定方程的解个数 , 之前只能求解 没有约束的情况 , 如果对变量有约束 , 如
韩曙亮
2023/03/28
1.4K0
【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
排列组合公式 与24点编程游戏
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。
一个会写诗的程序员
2022/01/27
1.1K0
排列组合公式 与24点编程游戏
LeetCode周赛306,用原题,你对得起我们吗,日内瓦,退钱!
昨天的这场由蔚来汽车赞助,前1000名能获得简历内推的机会。据我所知,蔚来最近正在大规模招人。有想要找工作的同学可以考虑一下。
TechFlow-承志
2022/08/26
4860
LeetCode周赛306,用原题,你对得起我们吗,日内瓦,退钱!
用“双射”的思想解决排列组合问题
“双射”(bijective)其实是个比较土味的数学名词,因为在关系代数中我们更喜欢称它为“一一映射”。关系代数是研究集合之间“映射关系”的数学分支,然后集合的概念抽象到别的学科上就产生了各种细分理论,上一篇《VLQ偏移自然数》也是围绕“双射”这个主题展开的,即编码与自然数一一映射。
Jean
2020/06/06
1.4K0
算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合
全排列(Permutation)是数学中一个经典的问题,指的是从一组元素中,将所有元素按任意顺序排列形成的所有可能序列。
hope kc
2025/06/02
850
算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合
【python刷题】关于一个序列的入栈出栈有多少种方式相关
剑指offer上有这么一道题目: 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 示例1: 输入
西西嘛呦
2021/03/11
8880
隔板法 学习笔记
在组合数学中,隔板法(又叫插板法)是排列组合的推广,主要用于解决不相邻组合与追加排列的问题。 隔板法就是在n个元素间插入(b-1)个板,即把n个元素分成b组的方法。——百度百科
yzxoi
2022/09/19
1.1K0
隔板法 学习笔记
我的第一本算法书
算法就是计算或者解决问题的步骤。我们可以把它想象成食谱。要想做出特定的料理,就要遵循食谱上的步骤;同理,要想用计算机解决特定的问题,就要遵循算法。这里所说的特定问题多种多样,比如“将随意排列的数字按从小到大的顺序重新排列”“寻找出发点到目的地的最短路径”,等等。
AI科技大本营
2019/06/14
1.2K0
聊一聊回溯算法
回溯法(英语:backtracking)是暴力搜寻法中的一种。是一种可以找出所有(或一部分)解的一般性算法
COY_fenfei
2023/08/05
6110
聊一聊回溯算法
排列组合公式的原理_有序排列组合公式
绪论:加法原理、乘法原理# 分类计数原理:做一件事,有n类办法,在第1类办法中有m1种不同的方法,在第2类办法中有m2种不同的方法,…,在第n类办法中有mn种不同的方法,那么完成这件事共有N=m1+m2+…+mn种不同的方法。
全栈程序员站长
2022/11/01
2.1K0
链表、DFS-LeetCode 216、213、148、202(链表归并排序,组合数问题)
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
算法工程师之路
2019/11/14
5420
推荐阅读
相关推荐
Mathematica 迷中智 | 奥运五环 数字谜题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档