昨日のRubyで作ったのをPythonに翻訳してみました。(^_^;
ついでに、今までに他の言語で作ったものも比較のために並べておきます。
●【プログラム クイズ】 アインシュタインのなぞなぞ (Einstein's Riddle) - rscの日記
●Einstein's riddle in JavaScript - rscの日記
●Einstein's riddle in Java - rscの日記
●Einstein's riddle in Ruby - rscの日記
ちなみに、RubyとPythonでは、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]
- 作者: 辻真吾
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/24
- メディア: 大型本
- 購入: 19人 クリック: 199回
- この商品を含むブログ (59件) を見る
- 作者: 柴田淳
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2012/08/25
- メディア: 単行本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (41件) を見る
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (30件) を見る