第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 でも似たようなことが出来たんですね。あまりこういう使い方を考えたことがなかったので新鮮でした。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki