判断推理のテニスのペアの問題をPythonで解いてみた。

 判断推理のテニスのペアの問題Pythonで解いてみました。(^_^;

 A〜Hの8人は大学のテニス部員であり、この8人について次のア〜ウのことがわかっているとき、この8人の男女の構成は何通りか。
ア CとDはダブルスの試合にペアで出場し、EとGも混合ダブルスの試合に出た。
イ BとDは混合ダブルスの試合にペアで出場し、DとGも混合ダブルスの試合に出た。
ウ AとGは同性。

 自力で解くと、条件に一番多く出てくるGとDに着目して、男性を+1、女性を-1として、G=x=±1とおくと、ダブルスに出たペアは同性で、混合ダブルスに出たベアは異性だから、
条件イの後半から、D=-x
条件アから、C=-x、E=-x
条件イの前半から、B=x
条件ウから、A=x
 以上から、一覧表をつくると、

ABCDEFGH
xx-x-x-xyxz
ただし、y=±1、z=±1とする。
 よって、自由に動ける変数は、3つで、その各々が、+1または、-1の2通りの値を取ることができるので、求める男女の構成は、
 2^3=8(通り)
 プログラムを作って検算すると、次の通りです。女性を'f'、男性を'm'として、直積product()で回してみました。(^_^;

● TennisPair1.py

# coding: UTF-8
# TennisPair1.py

import itertools
from time import time

def main():
    tm = time()  # Timer Start
    print('ABCDEFGH')
    cnt = 0
    for p in itertools.product('fm',repeat=8):
        a,b,c,d,e,f,g,h = p
        if c!=d or e==g: continue
        if b==d or d==g: continue
        if a!=g: continue
        cnt+=1
        print(''.join(p))

    print(u'∴%d'%cnt)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

ABCDEFGH
ffmmmfff
ffmmmffm
ffmmmmff
ffmmmmfm
mmffffmf
mmffffmm
mmfffmmf
mmfffmmm
∴8
Runtime : 0.000 [sec]

※参考URL
組み合わせや順列の列挙に便利なitertoolsの機能 | Python Snippets