知恵袋の判断推理の色玉の組分け問題を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)