知恵袋の数的推理の不等式の応用問題をPythonで解いてみました。(^_^;
ある塾のA組からC組までの3つの組には、合計105人の生徒が在籍しており、それぞれの組の生徒数に関して、次のア、イことがわかっている。
ア B組の生徒数の3倍は、A組の生徒数の2倍より5人以上多い
イ C組の生徒数は、A組からC組までの生徒数の合計の5割より7人以上少なく、B組の生徒数より20人以上多い。
このときB組の生徒数として正しいのはどれか。
条件イ-1は、整数にするために両辺を10倍しました。これはCでよく使うテクニックですね。(^_^;
● Inequality1.py
# coding: UTF-8 # Inequality1.py import itertools from time import time def main(): tm = time() # Timer Start for a,b,c in itertools.product(range(105+1),repeat=3): if a+b+c!=105: continue # 合計 if not b*3>=2*a+5: continue # 条件ア if not 10*c<=105*5-7*10: continue # 条件イ-1 if not c>=b+20: continue # 条件イ-2 # チェックを潜り抜けたものだけを表示 print('(a,b,c)=(%d,%d,%d)'%(a,b,c)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
(a,b,c)=(35,25,45) Runtime : 0.280 [sec]
ちなみに、重複組合せの丸(○)と仕切り(|)の考え方を使って、ループを次のように書き替えると高速化します。下のプログラムのp,qは仕切りの位置です。
● Inequality2.py
# coding: UTF-8 # Inequality2.py import itertools from time import time def main(): tm = time() # Timer Start for p,q in itertools.product(range(105+1),repeat=2): if not p<=q: continue a,b,c = p,q-p,105-q if not b*3>=2*a+5: continue # 条件ア if not 10*c<=105*5-7*10: continue # 条件イ-1 if not c>=b+20: continue # 条件イ-2 # チェックを潜り抜けたものだけを表示 print('(a,b,c)=(%d,%d,%d)'%(a,b,c)) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
(a,b,c)=(35,25,45) Runtime : 0.010 [sec]
※参考URL
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q115833341
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1352515108