知恵袋で見つけた判断推理の果物を分配する問題をPythonで解いてみた。

 知恵袋で見つけた判断推理の果物を分配する問題Pythonで解いてみました。(^_^;

 A〜Eの5人がそれぞれ4個ずつ自分の好きな果物をとった。
果物の内訳は、みかんが4個、りんごが6個、バナナが3個、いちごが7個である。
次のア〜エのことがわかっているとき、確実に言えるものはどれか。
ア:みかんをとったのはAとCだけ
イ:りんごをとったのはB、C、D
ウ:バナナをとらなかったのはDとE
エ:いちごをとらなかったのは一人だけで、Cではない

1、Aはいちごを1個とった。
2、Bはりんごを2個とった。
3、Cはみかんを2個とった。
4、Dはりんごを2個とった。

 効率悪そうですが、最近のPCの高速化に甘えて、思い付きの発想のまま作ってみました。(^_^;
 解が1通りに確定するようなので選択肢のチェックは省略しました。
 ちなみに、この問題は下の表を使えば自力の方が簡単に解けるかも。(^_^;

     0 1 2 3
 \| O A B S |計      \| O A B S |計      \| O A B S |計      \| O A B S |計 
---+---------+---    ---+---------+---    ---+---------+---    ---+---------+---
 A | o x o ? | 4      A | o x 1 ? | 4      A | 3 x 1 0 | 4      A | 3 x 1 0 | 4 
 B | x o o ? | 4      B | x o 1 ? | 4      B | x o 1 o | 4      B | x 2 1 1 | 4 
 C | o o o o | 4  ⇒  C | 1 1 1 1 | 4  ⇒  C | 1 1 1 1 | 4  ⇒  C | 1 1 1 1 | 4 
 D | x o x ? | 4      D | x o x ? | 4      D | x o x o | 4      D | x 3 x 1 | 4 
 E | x x x ? | 4      E | x x x 4 | 4      E | x x x 4 | 4      E | x x x 4 | 4 
---+---------+---    ---+---------+---    ---+---------+---    ---+---------+---
 計| 4 6 3 7 |20      計| 4 6 3 7 |20      計| 4 6 3 7 |20      計| 4 6 3 7 |20 

● Fruits.py

# coding: UTF-8
# Fruits.py

# [ミカン、リンゴ、バナナ、イチゴ]の個数をリストで得る
def getNums(a):
    s = "".join(a)+'|'
    r = []
    n = 0
    for i in range(len(s)):
        if s[i]=='|':
            r.append(i-n)
            n = i+1
    return r

def main():
    import itertools
    from time import time

    tm = time()  # Timer Start
    cnt = 0
    for pA in set(itertools.permutations('aaaa|||')):   # 同じものを含む順列
        nA = getNums(pA)
        if nA[1]!=0: continue                           # 高速化のため表から
        for pB in set(itertools.permutations('bbbb|||')):   # 同じものを含む順列
            nB = getNums(pB)
            if nB[0]!=0: continue                       # 高速化のため表から
            for pC in set(itertools.permutations('cccc|||')):   # 同じものを含む順列
                nC = getNums(pC)
                if 0 in nC: continue                    # 高速化のため表から(条件エ-2も含む)
                lO = [nA[0],nC[0]]
                if sum(lO)!=4 or 0 in lO: continue      # 条件アとミカンの合計
                lB = [nA[2],nB[2],nC[2]]
                if sum(lB)!=3 or 0 in lB: continue      # 条件ウとバナナの合計
                for pD in set(itertools.permutations('dddd|||')):   # 同じものを含む順列
                    nD = getNums(pD)
                    if sum([nD[0],nD[2]])!=0: continue  # 高速化のため表から
                    lA = [nB[1],nC[1],nD[1]]
                    if sum(lA)!=6 or 0 in lA: continue  # 条件イとリンゴの合計
                    for pE in set(itertools.permutations('eeee|||')):   # 同じものを含む順列
                        nE = getNums(pE)
                        if sum([nE[0],nE[1],nE[2]])!=0: continue    # 高速化のため表から
                        lS = [nA[3],nB[3],nC[3],nD[3],nE[3]]
                        if sum(lS)!=7: continue         # イチゴの合計
                        if lS.count(0)!=1: continue     # 条件エ-1
                        # チェックを潜り抜けたものだけを表示
                        cnt+=1
                        print("[%d]"%cnt)
                        print("   O  A  B  S")
                        print("A %s"%nA)
                        print("B %s"%nB)
                        print("C %s"%nC)
                        print("D %s"%nD)
                        print("E %s"%nE)

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

if __name__ == '__main__':
    main()

●実行結果

[1]
   O  A  B  S
A [3, 0, 1, 0]
B [0, 2, 1, 1]
C [1, 1, 1, 1]
D [0, 3, 0, 1]
E [0, 0, 0, 4]
Runtime : 0.359 [sec]

※参考URL
●要素の確認(in演算子, indexメソッド, countメソッド) - リスト - Python入門
http://www.pythonweb.jp/tutorial/list/index10.html