判断推理のカードの問題をPythonで解いてみた。(3)

 ネットで見つけた判断推理のカードの問題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のブログ