知恵袋で見つけた判断推理のプレゼント交換の問題をPythonで解いてみた。

 知恵袋で見つけた判断推理のプレゼント交換の問題Pythonで解いてみました。(^_^;

 A~Eの5人がプレゼント交換をした。5人とも自分以外の人から1つずつプレゼントを受け取ったが、プレゼントを渡した相手からプレゼントを受け取った人はいなかったという。さらに次のア~エのことがわかっているとき、確実にいえるのはどれか。
 ア.AはBからもDからもプレゼントを受け取らなかった。 
 イ.BはCかDからプレゼントを受け取った。 
 ウ.DはEからプレゼントを受け取らなかった。
 エ.EはBからもCからもプレゼントを受け取らなかった。
1.AはEにプレゼントを渡した。
2.BはCにプレゼントを渡した。
3.CはAにプレゼントを渡した。
4.DはBにプレゼントを渡した。
5.EはAにプレゼントを渡した。

 「5人とも自分以外の人から1つずつプレゼントを受け取った」を前提条件1、「プレゼントを渡した相手からプレゼントを受け取った人はいなかった」を前提条件2としました。
 前提条件2で、たとえば、「P.index(a)==p.index('A')」は、「p[P.index(a)]=='A'」でもいいです。(^_^;

● GiftExchange1.py

# coding: UTF-8
# GiftExchange1.py

import itertools
from time import time

def toStr(li):
    return '[%s]'%','.join(li)

# 確実にいえる選択肢を1つ得る
def getAns(choices):
    fmt = '%s' if choices.count(True)==1 else 'Error! {%s}'
    return fmt%getTrue('12345',choices)

def getTrue(s,li):
    return ','.join([s[i] for i in range(len(li)) if li[i]])

def main():
    tm = time() # Timer Start
    P = 'ABCDE' # プレゼントを渡した人
    choices = [True]*5
    cnt = 0
    for p in itertools.permutations(P):
        a,b,c,d,e = p   # 受け取った人
        # 前提条件1
        if a=='A' or b=='B' or c=='C' or d=='D' or e=='E': continue
        # 前提条件2
        if P.index(a)==p.index('A'): continue
        if P.index(b)==p.index('B'): continue
        if P.index(c)==p.index('C'): continue
        if P.index(d)==p.index('D'): continue
        if P.index(e)==p.index('E'): continue
        if not(a!='B' and a!='D'): continue     # 条件ア
        if not(b=='C' or  b=='D'): continue     # 条件イ
        if not d!='E': continue                 # 条件ウ
        if not(e!='B' and e!='C'): continue     # 条件エ
        pass # チェックを潜り抜けたものだけを表示
        cnt+=1
        print('%3d: %s'%(cnt,toStr(p)))
        pass # 選択肢のチェック
        choices[0] &= ('A'==e)
        choices[1] &= ('B'==c)
        choices[2] &= ('C'==a)
        choices[3] &= ('D'==b)
        choices[4] &= ('E'==a)

    print(u"∴%s"%getAns(choices))
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

  1: [E,C,A,B,D]
∴5
Runtime : 0.000 [sec]

※参考URL
判断推理の集団お見合いの問題をPythonで解いてみた。 - rscのブログ