問題
忽然想起很早之前看的一道邏輯題,大概是這麼說的:
你經過一個地方有兩座橋,其中一座通往地獄,一座通往天空。
橋的入口各有一個守衛,一個是魔鬼一個是天使,但是外表上無法分別,天使不一定站在天堂前,魔鬼也不一定站在地獄前。
魔鬼必定撒謊,天使必然說真話。
你現在只能問其中一個人一個問題,你該咋樣走上通往天堂的橋?
記得當時略加思索,毫無思路,直接翻了答案,恍然大悟。
答案
隨便找兩人中的一個,問他:問如果我問另外一個人這座橋通往哪兒,他會怎麼說?
- 如果是天使:
* 他站在天堂前:通往地獄
* 他站在地獄前:通往天堂 - 如果是魔鬼:
* 他站在天堂前:通往地獄
* 他站在地獄前:通往天堂
所以,不過他們回答什麼,你選擇給他們答案取反就可以了。
轉化爲代碼
現在,我想了想,這道題是不是可以轉化爲一道編程題,用程序來表示這個問題的邏輯。
直來直去的問
如果毫無頭腦地問,你面前的橋通往哪兒?
咱們用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
的答案啦,必然通往天堂。