题目
数学大臣尤泽尔受到国王亚路开德的召见,被侍卫克里亚带到了一个房间。在他的面前只有两扇门,门前各有一个守门人。
“两个守门人中有一个人只说真话,另一个人只说假话”,克里亚说,“陛下在其中一扇门后面等着您,但陛下要求您只可以问其中一个人一个问题。”
“另一扇门后面有什么?”尤泽尔问。
这位王国最聪明的头脑,以往都是二话不说地轻松解决所有谜题,今天居然问起了失败的后果。克里亚有些诧异,但还是耐心地解释道“只有一把空椅子。”
“不错”,尤泽尔呢喃了一句,令克里亚心里顿感不妙。
尤泽尔随便走向其中一个守门人,问了一个有些复杂的问题,守门人随即陷入沉思,那痛苦的表情让克里亚有些担心。但好在,几分钟过后,守门人还是回答了上来,是正确的门。然而,克里亚尚未来得及松一口气,只见尤泽尔直接打开了另外一扇门——然后坐到了那把空椅子上。在守门人赶上之前,尤泽尔砰地一声关上了门。
“让陛下来找我”,尤泽尔的声音透过门传来,“他只能问其中一个人一个问题”。
陛下应该问什么问题,才能找到正确的门?
答案(不唯一)
问其中一个守门人:“如果我问另一个守门人‘哪扇是正确的门’,他会回答哪扇门?”,回答的门就是错误的门,选择另一扇门即可。
证明
分类讨论:
- 若问到了说真话的守门人,则另一个守门人说的是假话,会回答错误的门,那么这个说真话的守门人就会告诉你错误的门
- 若问到了说假话的守门人,则另一个守门人说的是真话,会回答正确的门,那么这个说假话的守门人就会告诉你错误的门
所以无论问的是哪个守门人,回答都是错误的门,因此选择另一扇门即可。
原理
这里我们先完善一下“说假话”的定义:若答案是二元的(如是或不是、左或右等),则会说相反的答案;若答案非二元,则有可能说出任何不正确的答案。
我们先来弄清楚这个游戏存在的二元:
- 两个守门人,其中一个只说真话,一个只说假话
- 两扇门,只有一扇门是正确的
前者是游戏背景规则,也是做选择时的限制,但并非我们需要的答案;后者是游戏背景规则,也是我们需要的答案。
只问一个问题很难同时得到两个问题的答案,因此我们应该考虑放弃弄清楚谁说真话谁说假话,只要确定哪扇门是正确或错误的就可以了。换言之,我们需要问一个“不管问到说真话还是说假话的人,都会回答相同的答案”的问题。
答案的问题正是如此。从证明里我们能发现,不管问到说真话还是说假话的守门人,最后回答的都是错误的门。
为何能达成这样的效果呢?我们研究一下,问题的回答在被我们得知之前都经过了什么。以左边的门为正确的门且问到了说真话的守门人为例:
- 最内层的问题:哪扇是正确的门,此时回答为左
- 内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是假话,最内层回答为左,所以此时回答为右
- 外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是真话,内存回答为右,所以此时回答为右
再以左边的门为正确的门,且问到了说假话的守门人为例;
- 最内层的问题:哪扇是正确的门,此时回答为左
- 内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是真话,最内层回答为左,所以此时回答为左
- 外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是假话,内存回答为左,所以此时回答为右
可以发现,两次回答的过程的共同点是,回答都是被反转了一次的。
答案的巧妙之处在于,这个问题虽然只对一个守门人问了,但其实回答的过程把两个人都经过了,因此得到的回答一定是最内层问题的相反回答。
因此,原理同上的问题都可以完成本题的任务。如“另一个守门人会告诉我正确的门是左边的门吗?”,如果回答不会,那么正确的门就是左边的门。
思考
这里面有没有什么数学原理呢?
当然是有的。
说句题外话:逻辑解构系列里的谜题当然都是有更深的原理的,这样才值得我们研究,而且几乎必然离不开数学,这也是为什么尤泽尔是数学大臣而不是物理大臣或者解谜大臣。
理解上面的原理后,我们发现,因为原问题必定把两个守门人都经过一次,所以回答一定会被反转一次,此时两个守门人有点类似“串联”的关系。
用逻辑表示说真话与说假话使答案发生的变化的话,说真话就是保持不变,说假话就是取反。
答案问题中的“串联”,实际上就等价于最内层问题的一个取反,只不过是利用游戏规则表达成了语言而已。
flowchart LR A[原问题回答] B[说真话的守门人] C[说假话的守门人] D[给尤泽尔的回答] A-->B B--保持不变-->C C--取反-->D
同理,我们很容易想到另一种“串联”方法:将自己与自己串联。说真话串上说真话,答案不变;说假话串上说假话,就是取反再取反,也是不变。转换成语言就是“如果我问你,哪扇是正确的门,你会回答哪扇门?”
flowchart LR subgraph 问到说假话的守门人 direction LR E[原问题回答] F[说假话的守门人] G[说假话的守门人] H[给尤泽尔的回答] E-->F F--取反-->G G--再取反-->H end subgraph 问到说真话的守门人 direction LR A[原问题回答] B[说真话的守门人] C[说真话的守门人] D[给尤泽尔的回答] A-->B B--保持不变-->C C--保持不变-->D end
这样我们就得出了本题的另一个可能的答案,并且这个答案会直接得到正确的门,不用再反转一次,并且哪怕只有一个守门人也可以问到正确的门。
和位运算有关系吗?
过程之中的反转,很容易让我们联想到布尔值。提到布尔值,很容易联想到的就是逻辑运算或者位运算,这里我们研究位运算,那不得不做的就是看一下真值表。
以二元问题为例,我们把其中一个答案看作 $1$,相反答案看作 $0$。这里我们将一个问题在经过守门人之前的答案看作输入,守门人会给出的答案看作输出。
那么,只说真话的守门人的真值表:
输入 | 输出 |
---|---|
0 | 0 |
1 | 1 |
原封不动,我们可以看作和 $1$ 做与运算,也就是 x & 1
。
我们再来看看只说假话的守门人的真值表:
输入 | 输出 |
---|---|
0 | 1 |
1 | 0 |
取反,我们可以看作取反,也就是 ~x
,也可以看作 x ^ 1
。
由此,我们可以发现上面的第一种答案对应的运算其实就是 ~(x & 1)
或者 ~(x ^ 1)
,第二种对应的是 ~(~x)
或者 x ^ 1 ^ 1
。
由此我们也可以玩的更复杂一些,叠更多的运算。当然,由于我们并不知道哪个人说真话哪个人说假话,所以两种运算符的数量要一致。
例如,我们尝试构造 ~(~~x&1&1)&1
对应的问题:
graph LR A[原问题回答]-->B[真话]--不变-->C[真话]--不变-->D[假话]--取反-->E[假话]--取反-->F[真话]--不变-->G[假话]--取反-->H[尤泽尔]
问说假话的人:如果我问另一个人【如果我问另一个人〖如果我问你“如果我问另一个人‘如果我问你,哪扇是正确的门,你会回答哪扇门’,他会回答哪扇门”,你会回答哪扇门〗他会回答哪扇门】,他会回答哪扇门?
更多的守门人?
位运算总共有六种,运算对象有两种,由此可以构造出一共八种守门人,请选择你的角色:
位运算 | 对应的守门人 |
---|---|
x & 1 |
只说真话 |
x & 0 |
只说否 |
`x | 1` |
`x | 0` |
x ^ 1 |
只说假话 |
x ^ 0 |
只说真话 |
~x |
只说假话 |
左右移 | 胡言乱语 |
真的没办法同时问出谁说真话谁说假话吗?
施工中。
附录
参考文献
问题经过故事化(这会成为逻辑解构的传统),原问题与原答案来自于某本小说。
版权信息
本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。