Question:誰喝水? 誰養斑馬?
In [ ]:
import itertools
屋子 = 第一間, _, 中間, _, _ = [1, 2, 3, 4, 5]
所有順序 = list(itertools.permutations(屋子))
所有順序
In [ ]:
def 在右邊(h1, h2):
"h1 緊鄰 h2 的右邊."
return h1-h2 == 1
def 隔壁(h1, h2):
"h1 h2 在隔壁"
return abs(h1-h2) == 1
In [ ]:
def zebra_puzzle():
return [locals()
for (紅, 綠, 白, 黃, 藍) in 所有順序
for (英國人, 西班牙人, 烏克蘭人, 日本人, 挪威人) in 所有順序
for (咖啡, 茶, 牛奶, 橘子汁, 水) in 所有順序
for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in 所有順序
for (狗, 蝸牛, 狐狸, 馬, 斑馬) in 所有順序
if 英國人 is 紅 #2
if 西班牙人 is 狗 #3
if 咖啡 is 綠 #4
if 烏克蘭人 is 茶 #5
if 在右邊(綠, 白) #6
if OldGold is 蝸牛 #7
if Kools is 黃 #8
if 牛奶 is 中間 #9
if 挪威人 is 第一間 #10
if 隔壁(Chesterfields, 狐狸) #11
if 隔壁(Kools, 馬) #12
if LuckyStrike is 橘子汁 #13
if 日本人 is Parliaments #14
if 隔壁(挪威人, 藍) #15
]
zebra_puzzle()
時間太長!
In [ ]:
def zebra_puzzle():
return [locals()
for (紅, 綠, 白, 黃, 藍) in 所有順序
if 在右邊(綠, 白) #6
for (英國人, 西班牙人, 烏克蘭人, 日本人, 挪威人) in 所有順序
if 英國人 is 紅 #2
if 挪威人 is 第一間 #10
if 隔壁(挪威人, 藍) #15
for (咖啡, 茶, 牛奶, 橘子汁, 水) in 所有順序
if 咖啡 is 綠 #4
if 烏克蘭人 is 茶 #5
if 牛奶 is 中間 #9
for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in 所有順序
if Kools is 黃 #8
if LuckyStrike is 橘子汁 #13
if 日本人 is Parliaments #14
for (狗, 蝸牛, 狐狸, 馬, 斑馬) in 所有順序
if 西班牙人 is 狗 #3
if OldGold is 蝸牛 #7
if 隔壁(Chesterfields, 狐狸) #11
if 隔壁(Kools, 馬) #12
]
zebra_puzzle()
In [7]:
def result(d): return {i:[k for k,v in d.items() if v == i] for i in 屋子}
def zebra_puzzle():
return [result(locals())
for (紅, 綠, 白, 黃, 藍) in 所有順序
if 在右邊(綠, 白)
for (英國人, 西班牙人, 烏克蘭人, 日本人, 挪威人) in 所有順序
if 英國人 is 紅
if 挪威人 is 第一間
if 隔壁(挪威人, 藍)
for (咖啡, 茶, 牛奶, 橘子汁, 水) in 所有順序
if 咖啡 is 綠
if 烏克蘭人 is 茶
if 牛奶 is 中間
for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in 所有順序
if Kools is 黃
if LuckyStrike is 橘子汁
if 日本人 is Parliaments
for (狗, 蝸牛, 狐狸, 馬, 斑馬) in 所有順序
if 西班牙人 is 狗
if OldGold is 蝸牛
if 隔壁(Chesterfields, 狐狸)
if 隔壁(Kools, 馬) ]
zebra_puzzle()[0]
Out[7]: