判断推理の集団お見合いの問題をPythonで解いてみた。

 判断推理の集団お見合いの問題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のブログ

公務員試験 新スーパー過去問ゼミ3 判断推理 改訂版

公務員試験 新スーパー過去問ゼミ3 判断推理 改訂版

  • 作者: 資格試験研究会
  • 出版社/メーカー: 実務教育出版
  • 発売日: 2012/10/24
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 3回
  • この商品を含むブログを見る
判断推理がみるみるわかる! 解法の玉手箱[改訂版]

判断推理がみるみるわかる! 解法の玉手箱[改訂版]

上・中級公務員 標準判断推理―確かな解答力が身につく“基本書”

上・中級公務員 標準判断推理―確かな解答力が身につく“基本書”

公務員試験 判断推理必殺の解法パターン

公務員試験 判断推理必殺の解法パターン

畑中敦子の[判断推理・数的推理]苦手克服ノート (別冊受験ジャーナル)

畑中敦子の[判断推理・数的推理]苦手克服ノート (別冊受験ジャーナル)

  • 作者: 畑中敦子,受験ジャーナル編集部
  • 出版社/メーカー: 実務教育出版
  • 発売日: 2010/03/06
  • メディア: ?
  • 購入: 3人 クリック: 4回
  • この商品を含むブログを見る