判断推理の集団お見合いの問題をPythonで解いてみました。(^_^;
A〜Fの男性6人と,P〜Uの女性6人が集団でお見合いをした。終了時に各人は気に入った相手を1人ずつ選び,それについて次のア〜カのことがわかっている。このとき,Aを選んだ女性がいたとすると,その女性として確実なのは誰か。
ア. 誰からも選ばれない女性はいなかったが,互いに相手を気に入った組合せはなく,カップルは1組も成立しなかった。
イ. Aが選んだ女性と,Fが選んだ女性は,いずれもDを選んだ。
ウ. Bが選んだ女性はPで,Pが選んだ男性はCであった。
エ. Cが選んだ女性はQで,Qが選んだ男性は他の女性からも選ばれていた。
オ. Dは3人の女性から選ばれたが,Dが選んだ女性はFを選んだ。
カ. EはTを選んだ。1.Q 2.R 3.S 4.T 5.U
条件ア-1(前半)から、男性が選んだ女性の名前pは、itertools.permutations()を用いてループしました。
条件ア-2(後半)のカップル不成立の条件は、コメントアウトしても同じ結果を得るので、あってもなくても結果には影響しないようです。(^_^;
● Matchmaking1.py
# coding: UTF-8 # Matchmaking1.py from time import time import itertools MEN = 'ABCDEF' WOM = 'PQRSTU' # カップルが成立した数を求める def countCouples(lp,lq): cnt = 0 for i in range(len(lp)): if lq[WOM.index(lp[i])]==MEN[i]: cnt+=1 return cnt def main(): tm=time() # Timer Start print(" %s %s"%(MEN,WOM)) ch = [True]*5 cnt = 0 for p in itertools.permutations(WOM): # 条件ア-1 if p[MEN.index('B')]!='P': continue # 条件ウ-1 if p[MEN.index('C')]!='Q': continue # 条件エ-1 if p[MEN.index('E')]!='T': continue # 条件カ x,y = p[MEN.index('A')],p[MEN.index('F')] # A,Fが選んだ女性 z = p[MEN.index('D')] # D が選んだ女性 for q in itertools.product(MEN,repeat=6): if q.count('A')==0: continue # 前提条件 if q[WOM.index(x)]!='D': continue # 条件イ if q[WOM.index(y)]!='D': continue # 条件イ if q[WOM.index('P')]!='C': continue # 条件ウ-2 if q.count(q[WOM.index('Q')])<=1: continue # 条件エ-2 if q.count('D')!=3: continue # 条件オ-1 if q[WOM.index(z)]!='F': continue # 条件オ-2 if countCouples(p,q)!=0: continue # 条件ア-2 # チェックを潜り抜けたものだけを表示 cnt+=1 print("[%d] %s %s"%(cnt,''.join(p),''.join(q))) # 選択肢のチェック ch[0] &= (WOM[q.index('A')]=='Q') ch[1] &= (WOM[q.index('A')]=='R') ch[2] &= (WOM[q.index('A')]=='S') ch[3] &= (WOM[q.index('A')]=='T') ch[4] &= (WOM[q.index('A')]=='U') if cnt==0: ch = [False]*5 s = "" for c in ch: if c : s+=" %s. %s"%(ch.index(c)+1,WOM[ch.index(c)+1]) print(u"∴%s"%s) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
ABCDEF PQRSTU [1] RPQSTU CDDFAD [2] RPQUTS CDDDAF [3] SPQRTU CDFDAD [4] SPQUTR CDDDAF [5] UPQRTS CDFDAD [6] UPQSTR CDDFAD ∴ 4. T Runtime : 0.250 [sec]
P.S.
ちなみに、たとえば、MEN.index('A')やWOM.index(x)などのとこを次のように辞書を作って、Men['A']やWom[x]とすると、少しですが速くなります。(^_^;
MEN = 'ABCDEF' WOM = 'PQRSTU' Men = {v:i for i,v in enumerate(MEN)} Wom = {v:i for i,v in enumerate(WOM)}
※参考URL
●【覚書】リスト(list)→辞書(dict)変換 - 風柳メモ
●知恵袋で見つけた判断推理のプレゼント交換の問題をPythonで解いてみた。 - rscのブログ
- 作者: 資格試験研究会
- 出版社/メーカー: 実務教育出版
- 発売日: 2012/10/24
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 3回
- この商品を含むブログを見る
- 作者: 資格試験研究会
- 出版社/メーカー: 実務教育出版
- 発売日: 2009/01/23
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 8回
- この商品を含むブログ (6件) を見る
上・中級公務員 標準判断推理―確かな解答力が身につく“基本書”
- 作者: 田辺勉
- 出版社/メーカー: 実務教育出版
- 発売日: 2001/10/01
- メディア: 単行本
- 購入: 15人 クリック: 142回
- この商品を含むブログ (22件) を見る
- 作者: 鈴木清士
- 出版社/メーカー: 実務教育出版
- 発売日: 1999/11/01
- メディア: 単行本
- 購入: 2人 クリック: 11回
- この商品を含むブログ (15件) を見る
畑中敦子の[判断推理・数的推理]苦手克服ノート (別冊受験ジャーナル)
- 作者: 畑中敦子,受験ジャーナル編集部
- 出版社/メーカー: 実務教育出版
- 発売日: 2010/03/06
- メディア: ?
- 購入: 3人 クリック: 4回
- この商品を含むブログを見る