import itertools 
屋子 = 第一間, _, 中間, _, _ = [1, 2, 3, 4, 5]
所有順序 = list(itertools.permutations(屋子))
所有順序

def 在右邊(h1, h2):
    "h1 緊鄰 h2 的右邊."
    return h1-h2 == 1

def 隔壁(h1, h2):
    "h1 h2 在隔壁"
    return abs(h1-h2) == 1

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()

"""
Explanation: Zebra Puzzle

有五間房子
英國人住紅色的房子
西班牙人養狗
住綠色房子的人喝咖啡
烏克蘭人喝茶
綠色房子緊鄰的左邊（你的右邊）是白色房子
抽「Old Gold」牌香菸的人養蝸牛
黃色房子的人抽「Kools」牌香菸
正中間房子的人喝牛奶
挪威人住左邊（你的右邊）第一間房子
抽「Chesterfields」牌香菸的人，住在養狐狸的人的隔壁
抽「Kools」牌香菸的人，住在養馬的人隔壁
抽「Lucky Strike」牌香菸的人，喝橘子汁
日本人抽「Parliament」牌香菸
挪威人住在藍色房子的隔壁

 Question：誰喝水？ 誰養斑馬？
End of explanation
"""


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()

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]

"""
Explanation: 時間太長！
End of explanation
"""


