判断推理のカードの問題を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のブログ