はいどーもー
乙pyです。

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

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

皆さん

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

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

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


動画解説はこちら


初めの問題は
有名中学の入試問題.027


これは初学者の方々には難しいかもしれませんが
順列の問題です。

4つの異なる数字1 ,3 , [ ] ,9
この中から3つの数字を取り出して並べてできる
3桁の整数

これは4P3で24通りあるんですね。

この順列の求め方は実は
pythonだと非常に簡単に出来るんです。

まずはitertoolsをインポートします。
import itertools

このitertoolsを用いると
組み合わせや順列の結果を全部計算してくれます。

さてこの問題の場合は
4つの数値のうち、3つは固定されています。

あとは残る数値を変化させるようにして
試行していけば良いわけです。

なので試行する数値をリストに格納して
for文を書くということになります。

for x in [0,2,4,5,6,7,8]:


さて、順列の方ですが
itertools.permutations(リスト, 個数)
で作ることができます。

なのでfor文で送られる数値を使って
順列の元になる4つの数値を変数に格納します。

あとはこれを用いて順列を作ります。

次に
このライブラリを使って求められるものは
順列の結果が24個入ったリストが帰ってきます。

これはそのままでは3桁の整数になっていないので
この順列24個を3桁の数値に直します。

数値を文字にして連結して
また数値に戻すで3桁の数値にできます。

それを24回やって、一時的にリストに格納します。

問題の条件は平均が555ということなので
このリストに格納した3桁の整数を全部足しあわせたのを
個数24で割ってあげます。

この平均が555であれば
答えということになります。

プログラムはこうなりました。

for x in [0,2,4,5,6,7,8]:
    seq = (1,3,9,x)
    lis = []
    for i in list(itertools.permutations(seq,3)):
        s = int(''.join([str(i[0]),str(i[1]),str(i[2])]))
        lis.append(s)
    if sum(lis)//len(lis) == 555:
        print(x)
        break


順列、文字列操作、数値変換、平均を求めるなど
プログラムでの基本的な操作が
色々と組み合わさるので
プログラミング学習には良い問題ですね

お次は

有名中学の入試問題.025

問題が細かいですが
4桁の整数で条件に合うものが何個有るかを求めるという問題です。

ただし
100の位は0で固定なので
試行するのは千の位、10の位、1の位に絞られます。

次の条件は
10と1の位がひっくり返ってもそれぞれ
7で割れるというものです。

これは数字を文字に置き換えてあげることで
解くことができます。

4桁の整数と
その10の位と1の位がひっくり返ったものの
両方が7で割り切れれば条件に合致します。

という風にして、試行した分の結果を
リストに格納して、その個数が
回答になります。

プログラムだとこうなりました。

r = []
for x in range(1,10): # 1000の位
    for y in range(10): # 10の位
        for z in range(10): # 1の位
            a = '{x}0{y}{z}'.format(x=x,y=y,z=z)
            b = '{x}0{z}{y}'.format(x=x,y=y,z=z)
            if int(a)%7==0 and int(b)%7==0:
                r.append((a,b))
print(len(r))

文字列と数値の使い方は
プログラミングの基本のため
こういった問題を解くことで
プログラミングの基本が身について行くと思います。