知恵袋の数的推理の不等式の応用問題をPythonで解いてみた。

 知恵袋の数的推理不等式の応用問題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