乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

受験

はいどーもー
乙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)) 

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

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

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



はいどーもー
乙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まで分かってしまっているので
正直なところ
プログラムで解く意味がない問題になってしまいました。

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

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

はいどーもー
乙pyです。

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

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

皆さん

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

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

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


動画解説はこちら



さて最初の問題は
有名中学の入試問題.024

2桁と4桁の整数同士の結果を問う問題なので
試行回数が増えますね。

変数a と x の2重ループになるという考えで進みました。

整数aとxをかけると119868
整数aの10と1の位を0に置き換えたものを
変数bすると

求める数の条件は
a * x == 119868
かつ
b * x == 117600
になりますね。

あとは複数出たaの中から
最大の整数を求めれば終了です。


答えは次のようなプログラムになりました。
r = []
for a in range(1000,10000):
    for x in range(10,100):
        b = int(str(a)[0:2] +'00')
        if a * x == 119868 and b * x == 117600:
                r.append(a)
                print(a,x)
print(max(r))



お次の問題は
有名中学の入試問題.023


数字の穴埋め問題ですね

さて
整数ABCDEF に6をかけると
整数DEFABC になるという問題

普通に解くなら少しづつ試す感じになりますが
プログラムは力技で解いていきます。

6桁分の整数を全部条件に当てはめて解いてみます。

for i in range(100000,1000000):

そして
その変数 i を6桁のABCDEFと仮定して
それに6をかけてDEFABCになれば
正解が導き出せるわけです。

数値文字列にして、インデックスで各桁の数値を
変数a,b,c,d,e,fに置き換えます。

あとは条件に当てはまるかを
if文で書くだけです。

ABCDEFを求めるプログラムはこうなりました。

for i in range(100000,1000000):
    x =str(i)
    a,b,c,d,e,f = x[0],x[1],x[2],x[3],x[4],x[5]
    if i*6==int(d+e+f+a+b+c):
        print(x)
        break

DEFは末尾3桁をとれば良いですね。

プログラムで解く際には
試行回数が少ない方が効率が良いので
いかに試行回数を減らすことができるかも
ポイントになりますが

今回は力技でした。


このページのトップヘ