乙pyです。
暇なので受験シーズンだし
有名中学の算数の問題をプログラムで解けないかと
思ったりしたわけですね。
インターネットの
Googleで調べたんですが
そこで問題が難しそうな学校を見つけてしまったんですね。
皆さん
難しい中学校って知ってます?
自分は近所の中学校に行ったので
知らないんですけど
問題を解いてみたんですねー
というものの第二弾です。
動画解説はこちら
初めの問題は
これは初学者の方々には難しいかもしれませんが
順列の問題です。
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
順列、文字列操作、数値変換、平均を求めるなど
プログラムでの基本的な操作が
色々と組み合わさるので
プログラミング学習には良い問題ですね
お次は
問題が細かいですが
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))
文字列と数値の使い方は
プログラミングの基本のため
こういった問題を解くことで
プログラミングの基本が身について行くと思います。