ネットで見つけた去年と今年の身長の推理パズルの問題をPythonで解いてみました。(^_^;
問題の概要を記号や式で表してみると、次の通りです。
稲沢,国分,長岡,宮田,吉川の5人について、去年と今年のどちらの年も、それぞれ身長は違ってる。
去年の身長[cm]:{142,145,147,148,150}
今年の身長[cm]:{146,148,151,153,155}
次の条件から、「吉川さんは何cm身長が伸びたでしょう」
(ア) {稲沢の今年の身長}= 151[cm]
(イ) {去年と今年を比べて、一番伸びた身長}= 8[cm],
{長岡の伸びた身長}= 3[cm]
(ウ) ∀{伸びた身長}> 0 → {伸びた身長の最小値}> 0
(エ) {国分の去年の身長}<{吉川の去年の身長},
{国分の今年の身長}>{吉川の今年の身長}
(オ) {稲沢の伸びた身長}≧ 2[cm],
{国分の今年の身長}≠ 148[cm]
ただし、{伸びた身長}={今年の身長}−{去年の身長}で、条件に(ア)〜(オ)と名前を付けました。また、プログラムでは、次のような略号を用いました。
名前:(稲沢,国分,長岡,宮田,吉川)=(稲,国,長,宮,吉)
ちなみに、「みんな身長が伸びた」ということは、「{伸びた身長の最小値}> 0」ということですよね。(^_^;
● Height1.py
# coding: UTF-8 # Height1.py from time import time import itertools def main(): tm = time() # Timer Start N = u'稲国長宮吉' # 名前(固定) L = (142,145,147,148,150) # 去年の身長 T = (146,148,151,153,155) # 今年の身長 for l in itertools.permutations(L): if not l[N.index(u'国')]< l[N.index(u'吉')]: continue # 条件(エ-1) for t in itertools.permutations(T): if not t[N.index(u'稲')]==151: continue # 条件(ア) if not t[N.index(u'国')]!=148: continue # 条件(オ-2) dH = [] # 伸びた身長のリスト for n in N: dH.append(t[N.index(n)]-l[N.index(n)]) if not max(dH)==8: continue # 条件(イ-1) if not min(dH)> 0: continue # 条件(ウ) if not dH[N.index(u'長')]==3: continue # 条件(イ-2) if not dH[N.index(u'稲')]>=2: continue # 条件(オ-1) if not t[N.index(u'国')]> t[N.index(u'吉')]: continue # 条件(エ-2) # チェックを潜り抜けたものだけを表示 print('[ %s ]'%', '.join(N)) print(l) print(t) print(u'∴ %d[cm]'%dH[N.index(u'吉')]) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
[ 稲, 国, 長, 宮, 吉 ] (148, 147, 145, 142, 150) (151, 155, 148, 146, 153) ∴ 3[cm] Runtime : 0.025 [sec]
※参考URL
●買い物の推理パズルをPythonで解いてみた。
●花火大会の推理パズルをPythonで解いてみた。
●タワーの推理パズルをPythonで解いてみた。
●昼食の推理パズルをPythonで解いてみた。
●買い物の推理パズルをPythonで解いてみた。(2)
●願い事の推理パズルをPythonで解いてみた。