知恵袋で見つけた数的推理の果物の問題を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]