知恵袋の判断推理の色玉の組分け問題をPythonで解いてみた。

 知恵袋の判断推理の色玉の組分け問題Pythonで解いてみました。(^_^;

 赤、白、黒の玉が全部で8コある。このうち赤と白の玉の数は同じである。いま、これら8コを2コずつ袋詰めにしたい。赤と黒の玉が入った袋を最低1コはつくるとすると、正しくいえることは次のうちどれか。

1.場合は全部で4つである。
2.場合は全部で5つである。
3.白と黒の玉の入った袋がない場合もある。
4.同じ色の玉の入った袋が必ず最低1袋できる。
5.赤い玉2つが入った袋ができる場合が2つある。

 選択肢のチェックがいつもと違っていて苦労しました。(^_^;
 選択肢3のチェックで、「〜場合もある」ということで、初期値をFalseにして論理和をとりました。
 選択肢4はいつもの通り論理積をとって、残りは全体を通してカウントしておいて最後に1回判定しました。

● Grouping1.py

# coding: UTF-8
# Grouping1.py

from time import time
import itertools

def main():
    tm=time()  # Timer Start
    COLORS = 'BRW'  # (B,R,W): (黒,赤,白)
    ch = [False]*5
    cnt = nRR = 0
    for p in itertools.product(COLORS,repeat=8):
        s = '%s%s|%s%s|%s%s|%s%s'%p
        nB,nR,nW = p.count('B'),p.count('R'),p.count('W')
        if nR!=nW:        continue
        if nB+nR+nW!=8:   continue
        if 'BR' not in s: continue
        a,b,c,d,e,f,g,h = p
        if a> b or c> d or e> f or g> h : continue
        if a+b>c+d or c+d>e+f or e+f>g+h: continue
        # チェックを潜り抜けたものだけを表示
        cnt+=1
        if cnt==1: ch[3] = True
        t = s.replace('B',u'黒').replace('R',u'赤').replace('W',u'白')
        print(u"[%2d] %s"%(cnt,t))
        # 選択肢のチェックとその準備
        ch[2] |= ('BW' not in s)
        ch[3] &= ('BB' in s or 'RR' in s or 'WW' in s)
        if 'RR' in s: nRR+=1

    ch[0] = (cnt==4)
    ch[1] = (cnt==5)
    ch[4] = (nRR==2)

    s = ""
    for c in ch:
        if c : s+=" %s"%(ch.index(c)+1)
    print(u"∴%s"%s)
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

[ 1] 黒黒|黒黒|黒赤|黒白
[ 2] 黒黒|黒赤|黒赤|白白
[ 3] 黒黒|黒赤|黒白|赤白
[ 4] 黒赤|黒赤|黒白|黒白
[ 5] 黒赤|黒赤|赤白|白白
[ 6] 黒赤|黒白|赤赤|白白
[ 7] 黒赤|黒白|赤白|赤白
∴ 3
Runtime : 0.016 [sec]

※参考URL
Python入門 - 演算子
判断推理のカードの問題をJavaで解いてみた。
知恵袋で見つけた判断推理のトーナメントの問題をPythonで解いてみた。(3)