はいどーもー
乙pyです。

暇なので受験シーズンだし
有名中学の算数の問題をプログラムで解けないかと
思ったりしたわけですね。

インターネットの
Googleで調べたんですが
そこで問題が難しそうな学校を見つけてしまったんですね。

皆さん

難しい中学校って知ってます?

自分は近所の中学校に行ったので
知らないんですけど
問題を解いてみたんですねー

というものの第四弾です。


動画解説はこちら


初めの問題

有名中学の入試問題.022


まずは3桁の整数ABCを試行するとします

for abc in range(100,1000):


整数BCAと整数CABはそれぞれ
整数ABCを文字として扱って
インデックスを用いるとうまく抜き出すことができます。

整数BCAはABCの3/4倍
整数CABはBCAの3/4倍

ということは
整数CABはABCの9/16倍になりますね。

整数ABCと他の二つの数値の比較で
答えを求められます。

答えを求めるプログラムは次のようになりました。

for abc in range(100,1000):
    x = str(abc)
    bca = int(x[1]+x[2]+x[0])
    cab = int(x[2]+x[0]+x[1])
    if abc * 3//4==bca and abc*9//16==cab:
        print(abc)

この場合の答えは二つ出るようですね。


次の問題
有名中学の入試問題.021


5つの異なる偶数という条件だけだと
組み合わせは無限にあります。

まずは試行範囲を決めないといけないというところが
ポイントです。

できるだけ試行する組み合わせを減らしてあげないと
探索が厳しくなります。

幸い問題には
この試行範囲を減らすためのヒントが載っていました。
・5つの数の平均は61.6
・最も大きいのを除いた4つの平均は60.5
・最も小さいのを除いた4つの平均は63

ということは偶数の組み合わせとしては
X1 X2 X3 X4 X5 の平均は61.6
X1 X2 X3 X4      の平均は60.5
     X2 X3 X4 X5 の平均は63

ということなので
5つの平均 * 5 から それぞれの平均 * 4
で最小値と最大値が求められます。
x1 = int(61.6*5) - int(63*4)
x5 = int(61.6*5) - int(60.5*4)
すると
X1 , X5 は56と66になりました。

最大と最小が決まるので
それ以外の3つの偶数X2,X3,X4は
最大最小の間の偶数
58 , 60 , 62 , 64  4つに絞られます。

あとはこれを組み合わせとして
4つの中から3つ選び
X1とX5を足して
5つの偶数の平均が61.6になれば
正解になるかと思います。


正解を求めるプログラムは・・・
import itertools
x1 = int(61.6*5) - int(63*4)
x5 = int(61.6*5) - int(60.5*4)
for i in list(itertools.combinations((58,60,62,64),3)):
    if sum((x1,x5)+ i)/5==61.6:
        print(i)

組み合わせは
itertools.conbinations(リスト,組み合わせの数)
で求められます。

順列と違い、順番は考えないので
4つの偶数の中から3つを選ぶ方法は
4通りしかありません。

X1,X5まで分かってしまっているので
正直なところ
プログラムで解く意味がない問題になってしまいました。

プログラムを書く方が速いか
自力で解く方が速いのか

どちらが速く解けるか
ギリギリのラインの問題を
やってみたいですね。