python

python競技プログラム | 簡単な数学シミュレーション

当サイトでは広告が表示される記事があります

今回は、数式を立てて、時間発展していくような問題にしてみましょう。

天気とか画像とかのグラフィカルなシミュレーションではなくて、ただの数式なんですが、やってみましょう。

プログラムの行数も少ないので、できれば、学生へのアナウンスは、問題文と変数名ぐらいにできれば良いですね。

長年授業でやってきたことをまとめて、 ITパスポートの無料Note(1度落ちちゃった方向け) 基本情報技術者対策のNoteを作ってます。興味あったらどーぞ(▼・ω・▼)

菌の増殖

問題

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度とする」と云っても併せ伝えて良いです。
  • 長針と短針の角度の差を計算する。
    • 余裕があれば、小さい方の角度を計算せよ。

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 入っています。

ちょっと計算誤差でてますが、まぁいいでしょう。

まとめ

今回は、数式を立てて、時間発展していくような問題にしてみました。

これに、座標やグラフィックを入れれば、ゲームになるわけですね。

タイトルとURLをコピーしました