該怎麼走到通往天堂的橋?

問題

忽然想起很早之前看的一道邏輯題,大概是這麼說的:

你經過一個地方有兩座橋,其中一座通往地獄,一座通往天空。
橋的入口各有一個守衛,一個是魔鬼一個是天使,但是外表上無法分別,天使不一定站在天堂前,魔鬼也不一定站在地獄前。
魔鬼必定撒謊,天使必然說真話。
你現在只能問其中一個人一個問題,你該咋樣走上通往天堂的橋?

記得當時略加思索,毫無思路,直接翻了答案,恍然大悟。

答案

隨便找兩人中的一個,問他:問如果我問另外一個人這座橋通往哪兒,他會怎麼說?

  • 如果是天使:
    * 他站在天堂前:通往地獄
    * 他站在地獄前:通往天堂
  • 如果是魔鬼:
    * 他站在天堂前:通往地獄
    * 他站在地獄前:通往天堂

所以,不過他們回答什麼,你選擇給他們答案取反就可以了。

轉化爲代碼

現在,我想了想,這道題是不是可以轉化爲一道編程題,用程序來表示這個問題的邏輯。

直來直去的問

如果毫無頭腦地問,你面前的橋通往哪兒?

咱們用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的答案啦,必然通往天堂。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章