今回は、数式を立てて、時間発展していくような問題にしてみましょう。
天気とか画像とかのグラフィカルなシミュレーションではなくて、ただの数式なんですが、やってみましょう。
プログラムの行数も少ないので、できれば、学生へのアナウンスは、問題文と変数名ぐらいにできれば良いですね。
▼事前に読んで欲しい記事▼
菌の増殖
問題
1分経つごとに2倍になる細菌があります。
この細菌を瓶の中に1匹入れたところ、1時間で瓶が細菌で満たされました。
ここで問題です。
この細菌が瓶の半分の量になるのは、細菌を瓶に入れてから何分後でしょうか?
引用サイト様
今回は、二段階に分けて、少しずつ作ってみましょう。
課題1
課題は下記です。
- 細菌の数を、変数 vir_cnt に格納します。
- 1分ごとに菌の数を計算して、60分後までしなさい。
- 60分後の菌の数を表示しなさい。
# 60分後の菌の数を計算する。
vir_cnt = 1
for time in range(1,61): # 1分後から60分後まで計算する。
vir_cnt=vir_cnt*2
print(f"60分後の菌の数 {vir_cnt}")
60分後の菌の数 1152921504606846976
課題2
課題は下記です。
- 60分後の菌の数の半分を計算して、変数 vir_cnt_half に格納しなさい。
- もう一度菌の数を計算して、vir_cnt_halfになる時間を算出しなさい。
- vir_cnt_halfのなった時間と数を表示しなさい。
vir_cnt_half = vir_cnt/2 # 60分後の菌の数の半分を記録する。
# 菌の数を再度計算する。
vir_cnt = 1
for time in range(1,61):
vir_cnt=vir_cnt*2
if vir_cnt >= vir_cnt_half: # 菌の数がvir_cnt_halfになったら、計算を中断する。
print(f"{time}分後の菌の数 {vir_cnt}")
print(f"答え {time}分後")
break
59分後の菌の数 576460752303423488
答え 59分後
まとめ
細菌の英語って、ウィルスじゃなくてバクテリアですが、見逃してくださいw
# 60分後の菌の数を計算する。
vir_cnt = 1
for time in range(1,61): # 1分後から60分後まで計算する。
vir_cnt=vir_cnt*2
print(f"60分後の菌の数 {vir_cnt}")
vir_cnt_half = vir_cnt/2 # 60分後の菌の数の半分を記録する。
# 菌の数を再度計算する。
vir_cnt = 1
for time in range(1,61):
vir_cnt=vir_cnt*2
if vir_cnt >= vir_cnt_half: # 菌の数がvir_cnt_halfになったら、計算を中断する。
print(f"{time}分後の菌の数 {vir_cnt}")
print(f"答え {time}分後")
break
60分後の菌の数 1152921504606846976
59分後の菌の数 576460752303423488
答え 59分後
時計の針の角度
時計が9時半だった時、時計の長針と短針が作る角度は何度でしょうか?
角度の小さい方をお答えください。
引用サイト様
長針は、9時ちょうどのときは、9を指します。
しかし、長針は、9時30分のときは、9から少し進んだとこを指しますね。
課題は下記です。
- 時刻の時を変数h、分を変数mに格納する。
- 長針と短針の角度を計算する。
- 12を0として、右回りに角度を測るとする。
- 右回りが通じない可能性もあるので「3を指した時に角度90度とする」と云っても併せ伝えて良いです。
- 12を0として、右回りに角度を測るとする。
- 長針と短針の角度の差を計算する。
- 余裕があれば、小さい方の角度を計算せよ。
pythonコードの答えです。
h=9
m=30
if h==12:
h=0
short = (h+m/60)/12*360
long = m/60*360
if long > short:
ans = long - short
else:
ans = short - long
print(ans)
105.0
本の破れた頁を特定する。
時間発展ではないですが、シミュレーションとしていれました。
1枚だけページが破れた本があります。
破れていないページ番号を合計すると15000になります。
破れたページは何ページ目でしょうか?
引用サイト様
プログラムとしては、
1頁目を破ったら、合計はいくつになるか。
2頁目を破ったら、合計はいくつになるか。
を繰り返そうと思います。
二段階でプログラムを書いてみましょう。
課題1:考える頁数を計算してみる
課題は下記です。
- 頁番号の合計が15000を超える頁数を計算しなさい。
- 合計を格納する変数は sum とします。
sum = 0
for i in range(1,15000):
sum = sum+i
if sum >= 15000:
break
print(f"頁数{i} 頁番号の合計{sum}")
頁数173 頁番号の合計15051
なので、51少なくなるような頁を破ればいいんですね。
51=25+26。。。
見なかったことにして次を作りましょう!
課題2:頁破りシミュレーションしてみる
課題です。
- 破る頁を変数 j に格納します。
- 変数 j を変えながら、頁番号の合計を計算しなさい。
- 頁番号の合計が15000になったら計算を終了しなさい。
pythonコードの答えは下記です。
ポイントは、jとj+1頁目を破るってことですね。
import random
for i in range(1,174):
sum=0
for j in range(1,174):
if i != j and i+1 != j:
sum = sum + j
#print(f"{i} {sum}")
if sum == 15000:
print(f"{i}")
25
すこし細かい話なんですが、
頁番号の振り始めがどうなっているかが考慮されてないですね。
振り方によっては、25頁と26頁が別の紙になっていることもあると思います。
コップの移し替え
容器Aに2000Lの水が入っています。
この水を次の手順で移し替えていきます。
1回目は容器Aの1/2の量の水を容器Bに移す
2回目は容器Bの1/3の量の水を容器Aに移す
3回目は容器Aの1/4の量の水を容器Bに移す
・・・
1999回目は容器Aの1/2000の水を容器Bに移す1999回目の後に、容器Aに入っている水の量は?
引用サイト様
課題は下記です。
ひょっとしたら問題文の提示だけで充分ですね。
- 容器AとBの中の水の量は、変数a, b に格納します。
- 問題文の処理を合計2000回繰り返してください。
a=2000
b=0
for i in range(1,2000):
if i%2==1:
# print("a->b")
b=b+a/(i+1)
a=a-a/(i+1)
else:
# print("a<-b")
a=a+b/(i+1)
b=b-b/(i+1)
# print(f"{i} {a} {b}")
print(f"容器Aには、{a} 入っています。")
容器Aには、1000.0000000000002 入っています。
ちょっと計算誤差でてますが、まぁいいでしょう。
まとめ
今回は、数式を立てて、時間発展していくような問題にしてみました。
これに、座標やグラフィックを入れれば、ゲームになるわけですね。