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

 判断推理のカードの問題Pythonで解いてみました。(^_^;

AとBの2人がカードを4枚ずつ持っている。Aはカードに3~6の数字を1つずつ順に書き込んだ。Bも同様にするつもりだったが、途中で1つの数字を抜かしてしまい、4枚目の数字は7であった。2人は任意のカードを1枚ずつ出し、数の大小を比べたが、結果は次の通りであった。

1枚目:Bが2大きい
2枚目:Aが1大きい
3枚目:同じ数
4枚目:Bが2大きい

Bが抜かした数字は次のうちどれか。

1. 3
2. 4
3. 5
4. 6
5. わからない

 1枚抜いて求めたBのsetとAとの数の大小関係から求めたBのsetを比較してみました。(^_^;
 選択肢5の「わからない」とは、選択肢が1~4の一つに決まらなかったということですよね。(^_^;
 ちなみに、自分で解くと、Aの1~4枚目の数字を、(p,q,r,s)とすると、Bのカードの数字は、それぞれ、(p+2,q-1,r,s+2)となります。Bが抜かしたカードをxとして、Bの合計を2通りに表すと、
3+4+5+6+7-x=(p+2)+(q-1)+r+(s+2)
∴25-x=(p+q+r+s)+3
ここで、p+q+r+s=3+4+5+6=18
∴25-x=(18)+3=21
∴x=25-21=4

● Cards5.py

# coding: UTF-8
# Cards5.py

import itertools
from time import time

# 確実にいえる選択肢を得る
def getAns(cho,lbl='12345'):
    return ','.join([lbl[i] for i in range(len(cho)) if cho[i]])

def main():
    tm = time()  # Timer Start
    choices = [True]*4
    A = range(3,7)
    B = range(3,8)
    for n in A:
        b = set(B)-{n}      # set
        for p in itertools.permutations(A):
            a1,a2,a3,a4 = p
            q = (a1+2,a2-1,a3,a4+2)     # tuple
            if not set(q)==b: continue
            pass # チェックを潜り抜けたものを表示
            print(n,p,q)
            pass # 選択肢のチェック
            choices[0] &= (n==3)
            choices[1] &= (n==4)
            choices[2] &= (n==5)
            choices[3] &= (n==6)

    if choices.count(True)==1:
        print("∴%s"%getAns(choices))
    else:
        print("∴5")
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

4 (3, 4, 6, 5) (5, 3, 6, 7)
4 (4, 6, 3, 5) (6, 5, 3, 7)
4 (5, 4, 6, 3) (7, 3, 6, 5)
4 (5, 6, 3, 4) (7, 5, 3, 6)
∴2
Runtime : 0.000 [sec]

※参考URL
判断推理のカードの問題をPythonで解いてみた。 - rscのブログ
判断推理のカードの問題をPythonで解いてみた。(2) - rscのブログ
判断推理のカードの問題をPythonで解いてみた。(3) - rscのブログ
判断推理のカードの問題をPythonで解いてみた。(4) - rscのブログ