Einstein's riddle in Python

 昨日のRubyで作ったのをPythonに翻訳してみました。(^_^;
 ついでに、今までに他の言語で作ったものも比較のために並べておきます。
【プログラム クイズ】 アインシュタインのなぞなぞ (Einstein's Riddle) - rscの日記
Einstein's riddle in JavaScript - rscの日記
Einstein's riddle in Java - rscの日記
Einstein's riddle in Ruby - rscの日記

 ちなみに、RubyPythonでは、join()が逆になるようです。(^_^;
※参考URL
配列操作の比較表: Ruby, Python, JavaScript, Perl, C++

● Einstein.py

# coding: UTF-8
# Einstein.py
# # : 12345
# N : NDEGS
# H : YBRGW
# P : CHBFD
# D : WTMCB
# T : DMPRB

import itertools
from time import time

# 条件チェック: xからm個右側にyがあるか調べる
def check_cond(m, a, x, b, y):
    n = a.index(x)
    if n==ValueError or len(a)<=m+n:
        return False 
    if b[m+n]==y:
        return True  
    return False

# マッチング条件
def check_match(a, x, b, y):
    return check_cond(0, a, x, b, y)

# 順序付き隣接条件(左からx,yの順で隣接)
def check_adj_1(a, x, b, y):
    return check_cond(1, a, x, b, y)

# 隣接条件(順不定)
def check_adj_2(a, x, b, y):
    return check_adj_1(a,x,b,y) or check_adj_1(b,y,a,x)

def main():
    pass # Start of Main
    tm=time()  # Timer Start

    # 要素を昇順にソートしたもの
    PLACE =["1","2","3","4","5"]    # 場所(固定)
    NATION=["D","E","G","N","S"]    # 国、国籍
    HOUSE =["B","G","R","W","Y"]    # 家
    PET   =["B","C","D","F","H"]    # ペット
    DRINK =["B","C","M","T","W"]    # 飲み物
    TABACO=["B","D","M","P","R"]    # タバコ(ポルトガル語)

    # 連想配列
    Nation={
        "D" : u"D:デンマーク",
        "E" : u"E:イギリス",
        "G" : u"G:ドイツ",
        "N" : u"N:ノルウェー",
        "S" : u"S:スウェーデン"
    }

    place = PLACE[:]
    for nation in itertools.permutations(NATION,5):    # nation loop
        if not check_match(nation,'N',place, '1'): continue    # 条件09
        for house in itertools.permutations(HOUSE,5):    # house loop
            if not check_match(nation,'E',house, 'R'): continue    # 条件01
            if not check_adj_1(house, 'G',house, 'W'): continue    # 条件04
            if not check_adj_2(nation,'N',house, 'B'): continue    # 条件14
            for pet in itertools.permutations(PET,5):    #  pet loop
                if not check_match(nation,'S',pet,   'D'): continue    # 条件02
                for drink in itertools.permutations(DRINK,5):    #  drink loop
                    if not check_match(nation,'D',drink, 'T'): continue    # 条件03
                    if not check_match(house, 'G',drink, 'C'): continue    # 条件05
                    if not check_match(place, '3',drink, 'M'): continue    # 条件08
                    for tabaco in itertools.permutations(TABACO,5):    #  tabaco loop
                        if not check_match(tabaco,'P',pet,   'B'): continue    # 条件06
                        if not check_match(house, 'Y',tabaco,'D'): continue    # 条件07
                        if not check_adj_2(tabaco,'M',pet,   'C'): continue    # 条件10
                        if not check_adj_2(pet,   'H',tabaco,'D'): continue    # 条件11
                        if not check_match(tabaco,'B',drink, 'B'): continue    # 条件12
                        if not check_match(nation,'G',tabaco,'R'): continue    # 条件13
                        if not check_adj_2(tabaco,'M',drink, 'W'): continue    # 条件15
                        
                        # チェックを潜り抜けたものだけを表示
                        print("#:"+"".join(place ))
                        print("N:"+"".join(nation))
                        print("H:"+"".join(house ))
                        print("P:"+"".join(pet   ))
                        print("D:"+"".join(drink ))
                        print("T:"+"".join(tabaco))
                        print("")
                        print(u"∴"+Nation[nation[pet.index('F')]]+u"人")

    tm=time()-tm  # Timer Stop
    print("Runtime : %.3f [sec]"%tm)

# End of Main
if __name__ == '__main__':
    main()

●実行結果

#:12345
N:NDEGS
H:YBRGW
P:CHBFD
D:WTMCB
T:DMPRB

∴G:ドイツ人
Runtime : 0.141 [sec]

Pythonスタートブック

Pythonスタートブック

みんなのPython 第3版

みんなのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)