问题
忽然想起很早之前看的一道逻辑题,大概是这么说的:
你经过一个地方有两座桥,其中一座通往地狱,一座通往天空。
桥的入口各有一个守卫,一个是魔鬼一个是天使,但是外表上无法分别,天使不一定站在天堂前,魔鬼也不一定站在地狱前。
魔鬼必定撒谎,天使必然说真话。
你现在只能问其中一个人一个问题,你该咋样走上通往天堂的桥?
记得当时略加思索,毫无思路,直接翻了答案,恍然大悟。
答案
随便找两人中的一个,问他:问如果我问另外一个人这座桥通往哪儿,他会怎么说?
- 如果是天使:
* 他站在天堂前:通往地狱
* 他站在地狱前:通往天堂 - 如果是魔鬼:
* 他站在天堂前:通往地狱
* 他站在地狱前:通往天堂
所以,不过他们回答什么,你选择给他们答案取反就可以了。
转化为代码
现在,我想了想,这道题是不是可以转化为一道编程题,用程序来表示这个问题的逻辑。
直来直去的问
如果毫无头脑地问,你面前的桥通往哪儿?
咱们用go
语言来表示,对应的代码,如下所示:
func whetherToHeaven() bool {
heaven := true
hell := false
guards := [][]bool{
{heaven, hell},
{!heaven, !hell},
}
guardIndex, bridgeIndex := rand.Intn(2), rand.Intn(2)
return guards[guardIndex][bridgeIndex]
}
你在2*2
的可能性里面随机,答案可能是frue
也可能是false
绕着弯儿问
但是如果你用答案的方式去问,就得到这样的代码
func toHeaven() bool {
heaven := true
hell := false
guards := [][]bool{
{heaven, hell},
{!heaven, !hell},
}
guardIndex := rand.Intn(2)
return !guards[guardIndex^1][guardIndex]
}
这样一来,就得到都是true
的答案啦,必然通往天堂。