ネットで見つけた判断推理のカードの問題をPythonで解いてみました。(^_^;
1~13までの数字が1つずつ書かれた13枚のカードがある。この13枚のカードをA・B、2人に配ったところ以下のようになった。このとき確実にいえるのはどれか。
・Aには6枚が配られたが、そのうち5枚は偶数であった。
・Bに配られたカードに書かれた数の合計は44であった。
1.1と5が書かれたカードは、別の者が持っている。
2.2と13が書かれたカードは、同じ者が持っている。
3.3と8が書かれたカードは、別の者が持っている。
4.4と9が書かれたカードは、別の者が持っている。
5.6と8が書かれたカードは、同じ者が持っている。
前回の続きです。今回は、13個のものから6個選ぶ組合せで回して、偶奇表を作って、偶数の個数をチェックしました。(^_^;
ちなみに、前回のプログラムのように、aを偶数から5個選んで、奇数から1個選ぶ方法を使ってもいいのですが、最近のPCが速くなったので、やってもそれほどは差はないです。(^_^;
● Cards3.py
# coding: UTF-8 # Cards3.py import itertools from time import time # 確実にいえる選択肢を1つ得る def getAns(choices): fmt = '%s' if choices.count(True)==1 else 'Error! {%s}' lst = [str(i+1) for i in range(len(choices)) if choices[i]] return fmt%','.join(lst) # cとdが書かれたカードはaとbで同じ者が持っているか調べる def isSame(a,b,c,d): return (c in a and d in a)or(c in b and d in b) # cとdが書かれたカードはaとbで別の者が持っているか調べる def isSepa(a,b,c,d): return (c in a and d in b)or(c in b and d in a) def main(): tm = time() # Timer Start choices = [True]*5 Nums = range(1,14) for a in itertools.combinations(Nums,6): li = [n%2 for n in a] # 偶奇表を作成 if not li.count(0)==5: continue # 条件A b = tuple(set(Nums)-set(a)) # aが選んだものを取り除いた残り if not sum(b)==44: continue # 条件B pass # チェックを潜り抜けたものだけを表示 print(a,b) pass # 選択肢のチェック choices[0] &= isSepa(a,b, 1, 5) choices[1] &= isSame(a,b, 2,13) choices[2] &= isSepa(a,b, 3, 8) choices[3] &= isSepa(a,b, 4, 9) choices[4] &= isSame(a,b, 6, 8) print(u"∴%s"%getAns(choices)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
(2, 4, 6, 10, 12, 13) (1, 3, 5, 7, 8, 9, 11) (2, 4, 8, 10, 11, 12) (1, 3, 5, 6, 7, 9, 13) (2, 6, 8, 9, 10, 12) (1, 3, 4, 5, 7, 11, 13) (4, 6, 7, 8, 10, 12) (1, 2, 3, 5, 9, 11, 13) ∴4 Runtime : 0.003 [sec]
※参考URL
●判断推理のカードの問題をJavaで解いてみた。 - rscのブログ
●判断推理のカードの問題をPythonで解いてみた。 - rscのブログ
●判断推理のカードの問題をPythonで解いてみた。(2) - rscのブログ
●Googleの入社試験の覆面算をPythonで解いてみた。 - rscのブログ