知恵袋で見つけた数的推理の果物の問題をPythonで解いてみた。

 知恵袋で見つけた数的推理果物の問題Pythonで解いてみました。

果物屋で1個115円、299円、230円の3種類の果物を各種類ともそれぞれ少なくとも6個以上購入し、合計金額5750円を支払った。
消費税は考慮しないものとすると、この場合の購入の方法について確実にいえるものはどれか。
① 230円の果物は奇数個購入した
② 115円と299円の果物の合計購入数は偶数個であった
③ 購入方法は全部で6通りある
④ 最も多い果物の購入個数は13個である
⑤ 果物の購入個数は、合計26個以下であった

 プログラム的には、なんか選択肢のチェックがメインになってしまった感じです。(^_^;
 ちなみに、自力で解くと次の通りです。
 果物のそれぞれの個数をx[個]、y[個]、z[個]とすると、
 115x+299y+230z=5750…①
 少なくとも6個以上購入するので、
 115×6+299×6+230×6=3864…②
①−②
 115(x−6)+299(y−6)+230(z−6)=1886
 ここで、X=x−6, Y=y−6, Z=z−6と置き換えると、
 x=X+6, y=Y+6, z=Z+6・・・③
 115X+299Y+230Z=1886…④
 0≦X≦16, 0≦Y≦6, 0≦Z≦8…⑤
 ④から5を法とする合同式を考えると
 4Y≡1 (mod 5)
∴16Y≡4 (mod 5)
∴Y≡4 (mod 5)…⑥
 これと、⑤から0≦Y≦6なので
∴Y=4…⑦
 これと④から
 115X+230Z=690
∴X+2Z=6…⑧
∴(X,Z)=(6,0),(4,1),(2,2),(0,3)・・・⑨
 よって、③,⑦,⑨から
 (x,y,z)=(12,10,6),(10,10,7),(8,10,8),(6,10,9)

● Fruits2.py

# coding: UTF-8
# Fruits2.py

def main():
    from time import time

    tm = time()  # Timer Start
    ch = [True]*5
    a, b, c, N = 115, 299, 230, 5750
    cnt = 0
    for x in range(6,N//a):
        for y in range(6,N//b):
            for z in range(6,N//c):
                if a*x+b*y+c*z!=N: continue
                # チェックをくぐり抜けたものだけを表示
                cnt+=1
                print("[%d] %2d, %2d, %2d"%(cnt,x,y,z))
                # 選択肢のチェック
                ch[0] &= (z%2==1)
                ch[1] &= ((x+y)%2==0)
                ch[3] &= (max(x,y,z)==13)
                ch[4] &= (x+y+z<=26)

    ch[2] &= (cnt==6)
    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]  6, 10,  9
[2]  8, 10,  8
[3] 10, 10,  7
[4] 12, 10,  6
∴ 2
Runtime : 0.000 [sec]