不可能的谜题(The Impossible Puzzle)是一个数学问题, 乍看之下似乎没什么线索,无法作答,所以被称为“不可能的谜题”. 这谜题有很多个版本。这里用最原始的版本:
下面来来分析这个有趣的谜题, 并用选择 Wolfram 语言 求解出来: 一、P说不知道X和Y的具体值 那么,那些情况下他能确定 X 和 Y 的值呢?当 P 得到的数的乘法分解唯一的时候。如15=3*5,16=2*8,而当他知道的数为诸如20的时候就不能确定了(20=2*10=4*5)。那我们做的第一步就是可以缩小数对的范围。 首先产生所有的 x、y 数对,用 Wolfram 语言来实现就是下面代码, 如果你对 Wolfram 语言还比较默认, 可以跳到解题的下一个步骤. 由于Table 多参数产生的列表是多层的,所以需要压平一层。 初学者看不懂Wolfram 语言中这些##&@@@#&不要紧,把它当成Flatten[#,1]& 就好了,两者在大多数情况下可以互换。此处采用这个写法是为了少打 5 个字符以节约大量时间。 p1 则是 P 第一次对话后剩余的可能的 x、y 数对。先用 GatherBy 按积相等进行分组,用 Select 挑选分组的长度不少于 2,即分解不唯一的数对。 二、S说我知道你不知道X和Y的具体值 S 只知道 x、y 的和,为什么却能知道 P 不能确定答案呢?无论 S 得到的数如何加法分解,每一对和分解的乘积的乘法分解不唯一,就能得出这样的结论。比如S得到了11, 11=2+9=3+8=4+7=5+6, 2*9=3*6, 3*8=4*6, 4*7=2*11, 5*6=3*10。 由于 S 足够聪明,他知道 P 的推理过程,自然能得出上面的 p1 表。换句话说,S 做出题设的结论,如果 S 得到的数的的加法分解数对全在 p1 表中的时候。于是可再次缩小数对范围。 下面是代码求解: 先对 p1 压平,按和相等进行分组,用 Select 挑选每组长度为所有分解长度的数组。可见此时 S 的值已锁定在 10 个值之内。 三、P说已经知道了答案 P 说已经知道了答案,那他是如何做到的呢?P 足够聪明,他知道 S 的推理过程,也就知道了 s1 的数对集合。说明在自己知道的数的乘法分解中,仅有一个数对在 s1 表中。据此可以再次缩小数对的范围。 先对s1进行压平,按积相等进行分组,用Select挑选每组长度为1的数组。 四、S说他也知道了答案 S 足够聪明,也得出了 p2 的数对集合,而且自己得到的数的加法分解中仅有一个数对在 p2 表中。让我们再来试试。 先对 p2 进行压平,按和相等进行分组,用Select挑选每组长度为1的数组。 可见此数对唯一,答案已然揭晓。 这道不可能的谜题最早是由汉斯·弗赖登塔尔得在 1969 年发表,而“不可能的谜题”这个名字是由马丁·加德纳所提出的, 加德纳可是 20 世纪下半叶, 美国数学科普界叱咤风云的人物, 除了他之外还有两位大师级的人物:艾萨克·阿西莫夫与卡尔·萨根. 这些大师均已逝世, 未来我们会用一系列这些文章来纪念他们. 下面看来加德纳老先生著名的"水手分椰子"趣题:
这道趣题解法很多, 您想尝试下吗? 有兴趣的请将答案发至 meemath@foxmail.com, 我将在下一期数学智力游戏文章中将解答方法公布. |
|