判断推理の集団お見合いの問題

d.hatena.ne.jp

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

import copy
import itertools


def Couple_Count(men, wom):

    count = 0

    for k, v in men.items():
        if men[k] == wom[v]:
            count += 1

    return count

# 男性、女性の辞書作成
men = {k: None for k in 'ABCDEF'}
wom = {k: None for k in 'PQRSTU'}

# ウ. Bが選んだ女性はPで,Pが選んだ男性はCであった。

men['B'] = 'P'
wom['P'] = 'C'

# カ. EはTを選んだ。

men['E'] = 'T'

# エ. Cが選んだ女性はQ

men['C'] = 'Q'

# 未決定の男性のリスト
nmen = [k for k, v in sorted(men.items()) if not v]

# 未決定の女性のリスト
nwom = {i for i in wom.keys()} - {v for k, v in men.items() if v}


# 表示用
print('  ' + 'ABCDEF' + ' ' + 'PQRSTU')

for i, s in enumerate(itertools.permutations(nwom), 1):

    cmen = copy.deepcopy(men)
    cwom = copy.deepcopy(wom)

    for m, w in zip(nmen, s):

        cmen[m] = w

# イ. Aが選んだ女性と,Fが選んだ女性は,いずれもDを選んだ。

    cwom[cmen['A']] = 'D'
    cwom[cmen['F']] = 'D'

# オ. Dが選んだ女性はFを選んだ。

    cwom[cmen['D']] = 'F'

    # Tを選んでいる男性以外のリスト作成
    pattern_t = {k for k, v in cmen.items() if v != 'T'}

    for t in pattern_t:

        cwom['T'] = t

# エ. Qが選んだ男性は他の女性からも選ばれていた。

        # 他の女性から選ばれている男性のリスト作成
        pattern_q = {v for v in cwom.values() if v}

        for q in pattern_q:

            cwom['Q'] = q

# オ. Dは3人の女性から選ばれた

            pattern_d = [v for v in cwom.values() if v == 'D']

            if len(pattern_d) == 3:

                # ア. 誰からも選ばれない女性はいなかったが,互いに相手を気に入った組合せはなく,カップルは1組も成立しなかった。

                if Couple_Count(cmen, cwom) == 0:

                    ans_men = [v for k, v in sorted(cmen.items())]
                    ans_wom = [v for k, v in sorted(cwom.items())]

                    # Aが選ばれているもの
                    if 'A' in ans_wom:

                        print(i, ''.join(ans_men), ''.join(ans_wom))

import copy
import itertools

men = {k: None for k in 'ABCDEF'}
wom = {k: None for k in 'PQRSTU'}

# 男性確定

men['B'] = 'P'
men['C'] = 'Q'
men['E'] = 'T'

# 女性確定
# Qが選んだ男性は他の女性からも選ばれていた
# Dは3人の女性から選ばれた
# TはRSUがDDFのどれかのためA以外になるとQはAになれないのでAで確定
# QはADFのどれかになるがAFになるとDが3人にならないのでQはDで確定

wom['P'] = 'C'
wom['Q'] = 'D'
wom['T'] = 'A'

# 男性未確定
# nmen = [k for k, v in sorted(men.items()) if not v]
nmen = ['A', 'D', 'F']

# 女性未確定
# nwom = {i for i in wom.keys()} - {v for k, v in men.items() if v}
nwom = ['R', 'S', 'U']

# 表示用
print('  ' + 'ABCDEF' + ' ' + 'PQRSTU')

# 女性未確定の組合せ作成
for i, s in enumerate(itertools.permutations(nwom), 1):

    cmen = copy.deepcopy(men)
    cwom = copy.deepcopy(wom)

    for m, w in zip(nmen, s):

        cmen[m] = w

    cwom[cmen['A']] = 'D'
    cwom[cmen['D']] = 'F'
    cwom[cmen['F']] = 'D'

    ans_men = [v for k, v in sorted(cmen.items())]
    ans_wom = [v for k, v in sorted(cwom.items())]

    print(i, ''.join(ans_men), ''.join(ans_wom))