数的推理の整数の不定方程式の応用問題をPythonで解いてみました。(^_^;
ある高校の事務部門には、教務課、生徒課、総務課の3課があり、課長3人、課員27人の計30人の職員がいる。
課員の数が最も多いのが教務課で、総務課が最も少ない。
女性職員は教務課は4人、生徒課2人、総務課7人であるが、女性の課長はいない。
また、男性の課員のいない課はない。
以上のことからいえることとして正しいのはどれか。1 教務課の総数は課長以下13人である。
2 教務課の男性は生徒課より多い。
3 生徒課の男性の課員は7人である。
4 総務課の男性の課員の数は偶数である。
5 この高校の男性の事務員は20人以上いる。
数学的に解けば、教務課、生徒課、総務課の男性の課員数をそれぞれ、x[人]、y[人]、z[人]として、教務課、生徒課、総務課の課員数をそれぞれ、X[人]、Y[人]、Z[人]とすると、題意から、
X+Y+Z=27 …①
X>Y>Z …②
X=x+4, Y=y+2, Z=z+7 …③
x,y,z>0 …④
①,②から、 3Z<X+Y+Z=27 ∴Z<9 …⑤ ③,④から、 X>4, Y>2, Z>7 …⑥ ⑤,⑥から、 7<Z<9 ∴Zは整数だから、Z=8 …⑦ ①,⑦から、 X+Y+8=27 ∴X+Y=19 …⑧ ②,⑧から、 2Y<X+Y=19 ∴Y<19/2=9.5 …⑨ ②,⑦から、 X>Y>8 …⑩ ⑨,⑩から、 8<Y<9.5 ∴Yは整数だから、Y=9 …⑪ ⑧,⑪から、 X+9=19 ∴X=10 …⑫ ③,⑦,⑪,⑫から、 X=x+4=10, Y=y+2=9, Z=z+7=8 ∴(x,y,z)=(6,7,1)
以下省略。(^_^;
プログラムを作って検算すると、次の通りです。
● IndeterminateEq1.py
# coding: UTF-8 # IndeterminateEq1.py from time import time def main(): tm = time() # Timer Start ch = [False]*5 cnt = 0 for x in range(1,27): # 教務課の男性の課員数 for y in range(1,27): # 生徒課 〃 for z in range(1,27): # 総務課 〃 X,Y,Z = x+4,y+2,z+7 # 教務課、生徒課、総務課の課員数 if X+Y+Z!=27: continue if not(X> Y> Z): continue # チェックを潜り抜けたものだけを表示 cnt+=1 print('(x,y,z)=(%d,%d,%d)'%(x,y,z)) # 選択肢のチェック if cnt==1: ch = [True]*5 ch[0] &= (X+1==13) ch[1] &= (x> y) ch[2] &= (y==7) ch[3] &= (z%2==0) ch[4] &= (x+y+z+3>=20) 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()
●実行結果
(x,y,z)=(6,7,1) ∴ 3 Runtime : 0.026 [sec]
※参考URL
●知恵袋の数的推理の不等式の応用問題をPythonで解いてみた。 - rscの日記