判断推理のテニスのペアの問題を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
以上から、一覧表をつくると、
A | B | C | D | E | F | G | H |
x | x | -x | -x | -x | y | x | z |
よって、自由に動ける変数は、3つで、その各々が、+1または、-1の2通りの値を取ることができるので、求める男女の構成は、
(通り)
プログラムを作って検算すると、次の通りです。女性を'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