はいどーもー
乙pyです。

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

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

皆さん

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

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

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


動画解説はこちら




始めの問題
有名中学の入試問題.020

まずは
小手調的な問題

N回何かする的なものは
プログラムは大得意な領域

ABCDEFGHを
EAFBGCHDするということは

整数を文字に直して
インデックスで操作できます。

あとはそれを100回繰り返してやるだけです。

こんな感じのコードにしました。
a = '12345678'
answer = ''
for i in range(100):
    a = a[4]+a[0]+a[5]+a[1]+a[6]+a[2]+a[7]+a[3]
    answer = a
print(answer)

インデックスと順番は1つズレるので
そこだけ注意ですね


次の問題

有名中学の入試問題.019


さて
これは
組み合わせの問題になりますね。

1,5,10,50円を複数枚
組み合わせて50円にする場合

1円は必ず5枚1セットになるので
for文ではカウンターを5ずつ上げることにしました。

答えは
50円になる組み合わせと
100円になる組み合わせのふた通りを変数に用意する。

こんな感じのコードを書きました。
ans50  = []
ans100 = []
for i1 in range(0,101,5):
    for i5 in range(0,21):
        for i10 in range(0,11):
            for i50 in range(0,3):
                if (i1+i5*5+i10*10+i50*50)==50:
                    ans50.append((i1,i5,i10,i50))
                if (i1+i5*5+i10*10+i50*50)==100:
                    ans100.append((i1,i5,i10,i50))            
4重ループは
少し汚いですね・・・・

itertoolsのProduct
なんかを使うとすっきり書けます。
from  itertools import product

ans50,ans100  = [],[]
for i1 , i5 , i10 , i50 in product(range(0,101,5),range(0,21),range(0,11),range(0,3)):
    if (i1+i5*5+i10*10+i50*50)==50:
        ans50.append((i1,i5,i10,i50))
    if (i1+i5*5+i10*10+i50*50)==100:
        ans100.append((i1,i5,i10,i50))  
print(len(ans50))
print(len(ans100)) 

どちらで書いても
実行される結果は一緒になります。

ネストされる階層が深すぎると
見づらくなるので
まとめてしまうのもアリです。

今回はここまで
ではまた。