このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集のCランクレベルアップメニューから「シミュレーション (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
カウンター魔法を得意とするパイザ君は、同じくカウンター魔法を使うモンスターと戦っています。バトルはターン制で、パイザ君が先攻で、パイザ君とモンスターで交互に魔法を使い合います。パイザ君の魔法は 1 回目と 2 回目に使うときにはダメージ 1 ですが、 3 回目以降の n 回目には、(モンスターから受けた (n – 1) 回目の攻撃のダメージ) + (モンスターから受けた (n – 2) 回目の攻撃のダメージ) のダメージを与えます。モンスターの魔法はこれよりも強力で、 1 回目と 2 回目には同じくダメージ 1 ですが、 3 回目以降の n 回目には、 (パイザ君から受けた (n – 1) 回目の攻撃のダメージ) * 2 + (パイザ君から受けた (n – 2) 回目の攻撃のダメージ) のダメージを与えます。
パイザ君は自分がどれくらいモンスターの攻撃を耐えられるか知りたいと思っています。パイザ君の体力を H として、両者が同じ魔法を使い続けたとき、モンスターの何回目の攻撃でパイザ君の体力が 0 以下になるかを出力してください。
入力される値
入力は以下のフォーマットで与えられます。
1 |
H |
- 1 行目にパイザ君の体力を表す整数 H が与えられます。
期待する出力
モンスターの何回目の攻撃でパイザ君の体力が 0 以下になるかを出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。
考え方
執筆中
アルゴリズムそのものは難しくないが、日本語を正確に理解する能力が問われる。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// パイザくんの体力 var h = Int(readLine()!)! // 攻撃ターン var turn = 0 // パイザくんとモンスターが相手から受けたダメージ var dp = 0 var dm = 0 // パイザくんとモンスターが相手から (n - 1) 回目に受けたダメージ var pn1 = 0 var mn1 = 0 // パイザくんとモンスターが相手から (n - 1) 回目に受けたダメージ var pn2 = 0 var mn2 = 0 var i = 0 while h > 0 { if i < 2 { // 最初2回の攻撃で与えるダメージは 1 dp = 1 dm = 1 } else { // 3回目以降に相手に与えるダメージ // パイザくんがうけるダメージは、モンスターが受けた (n - 1)回目の2倍と (n - 2)回目の和 dp = mn1 * 2 + mn2 // モンスターに与えるダメージは、パイザくんから受けた (n - 1)回目と (n - 2)回目の和 dm = pn1 + pn2 } // 過去に与えたダメージを保存 pn2 = pn1 pn1 = dp mn2 = mn1 mn1 = dm // パイザくんの残り HP から受けたダメージを引く h -= dp i += 1 } // 結果表示 print(i) |