第103回【Python】条件を満たす最小の自然数、シミュレーションの練習、シミュレーション
現在取り組んでいるのは、paiza ラーニング問題集「C ランクレベルアップメニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 103 回目です。
会社には置き菓子制度があります。まぁ、LeoSaki(旦那)が勝手に作ったんですが。LeoSaki(旦那)がいるうちはあまり減らないのに、LeoSaki(旦那)が休み明けに出社すると一気に減っています。みんな LeoSaki(旦那)の目を気にせずに食べていいんだけどなぁ。
それでは、今日も頑張ってみようと思います。
条件を満たす最小の自然数
10000 以上かつ 13 で割り切れるような最小の自然数を求めてください。
なし
すべてのテストケースにおいて、以下の条件をみたします。
なし
入力例
出力例
while ですね。たまに無限ループに突入させてあたふたするやつです。ループを抜ける記載と、N に 1 加算する記載を忘れないように(後者を忘れてあたふたしたのは内緒)。
Python
N = 10000
while True:
if N % 13 == 0:
break
N += 1
print(N)
VBA
N = 10000
Do
If N Mod 13 = 0 Then Exit Do
N = N + 1
Loop
Debug.Print N
シミュレーションの練習
パイザ君と霧島京子は最初どちらも数 1 をもっています。パイザ君は自分の番が来ると、自分のもっている数の a 倍を霧島京子の数に足してあげます。霧島京子は自分の番が来ると、自分のもっている数を b で割った余りをパイザ君の数に足してあげます。この手続きをパイザ君の番から始めて、霧島京子の数がnより大きくなるまで繰り返します。
手続きが終わったときのパイザ君の操作回数を求めてください。
n
a b
1 行目には整数 n が与えられ、 2 行目には a, b が半角スペース区切りで与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・ 2 ≤ n ≤ 10000
・ 1 ≤ a , b ≤ 10
入力例
6
3 2
出力例
2
なんかミニゲーム的な感じで面白い。条件のある手続き。
Python
n = int(input())
a,b = map(int,input().split())
p,k = 1,1
cnt = 0
while True:
k += p * a
cnt += 1
if k > n:
break
p += k / b
print(cnt)
VBA
N = Cells(1, 1)
AB = Split(Cells(2, 1), " ")
A = Val(AB(0))
b = Val(AB(1))
paiza = 1
kyoko = 1
cnt = 0
Do
kyoko = kyoko + paiza * A
cnt = cnt + 1
If kyoko > N Then Exit Do
paiza = paiza + kyoko Mod b
Loop
Debug.Print cnt
シミュレーション
カウンター魔法を得意とするパイザ君は、同じくカウンター魔法を使うモンスターと戦っています。バトルはターン制で、パイザ君が先攻で、パイザ君とモンスターで交互に魔法を使い合います。パイザ君の魔法は 1 回目と 2 回目に使うときにはダメージ 1 ですが、 3 回目以降の n 回目には、(モンスターから受けた (n – 1) 回目の攻撃のダメージ) + (モンスターから受けた (n – 2) 回目の攻撃のダメージ) のダメージを与えます。モンスターの魔法はこれよりも強力で、 1 回目と 2 回目には同じくダメージ 1 ですが、 3 回目以降の n 回目には、 (パイザ君から受けた (n – 1) 回目の攻撃のダメージ) * 2 + (パイザ君から受けた (n – 2) 回目の攻撃のダメージ) のダメージを与えます。
パイザ君は自分がどれくらいモンスターの攻撃を耐えられるか知りたいと思っています。パイザ君の体力を H として、両者が同じ魔法を使い続けたとき、モンスターの何回目の攻撃でパイザ君の体力が 0 以下になるかを出力してください。
H
1 行目にパイザ君の体力を表す整数 H が与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
3 ≤ H ≤ 10^8
入力例
7
出力例
4
モンスターを倒すまでのターン数ではなく、モンスターに倒されるまでのターン数を求めるのか。なんて後ろ向きな!
Python
H = int(input())
P = [0,1,1]
M = [0,1,1]
dmg = 2
cnt = 2
while dmg < H:
P[0] = P[1]
P[1] = P[2]
M[0] = M[1]
M[1] = M[2]
P[2] = M[1] + M[0]
M[2] = P[1] * 2 + P[0]
dmg += M[2]
cnt += 1
print(cnt)
VBA
H = Cells(1, 1)
P = Array(0, 1, 1)
M = Array(0, 1, 1)
dmg = 2
cnt = 2
Do While dmg < H
P(0) = P(1)
P(1) = P(2)
M(0) = M(1)
M(1) = M(2)
P(2) = M(1) + M(0)
M(2) = P(1) * 2 + P(0)
dmg = dmg + M(2)
cnt = cnt + 1
Loop
Debug.Print cnt
最後に
これで、「C ランクレベルアップメニュー」はすべて終了です。次回からは、B ランク獲得のためのメニューに挑戦します。まだまだボリュームありそう。
今回挑戦した 3 問は、応用次第でいろんな場面で使えそうな気がします。もちろんいろいろと組み合わせて、でしょうけれど。VBA でも似たようなことが出来たんですね。あまりこういう使い方を考えたことがなかったので新鮮でした。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません