B - Back to the Future

2 secs 1024 MB
Machonium's icon Machonium

概要

ループと条件分岐などを組み合わせて,与えられた課題を正確に実装しましょう.
少しの工夫で楽をすることもできます.

問題原案:@machoniump

解説

.Ⅰ. 課題の抽象化

past, now, future をそのまま用いて,条件分岐などで行動を表すことも可能ですが,若干冗長になってしまいます.
そこで,もう少し表現の仕方を工夫してみましょう.

与えられた行動は,33 つの世界を左からそれぞれ 0,1,20, 1, 2 のような数値に対応させると,次のように考えることができます.

  • 初めに 00 から 22 までの整数が一つ与えられる.(以下 XX とおく)
  • 文字列 SS を先頭から一文字ずつ見ていき,その文字が
    • B なら,XX から 11 を引く.
    • G なら,XX11 を足す.
  • XX00 以上 22 以下の範囲におさめる()^{_{(*)}}

課題をこのように捉えることで,実装を簡潔にまとめることができます.

Note():\xmapsto{\mathrm{Note}} \scriptsize (*): より厳密には,XX00 未満なら XX00 に,22 既超なら 22 にします.

.Ⅱ. 実装

基本的には上記のことをそのまま実装するだけですが,if などを極力使わずに短い式で記述する方法もあります.

1)1) 条件分岐

具体的には,多くの言語にある「三項演算子」を利用します.(詳細は各言語のリファレンス等を参照してください.)
実際のコードは次の「実装例」項にあります.

2)2) 「おさめる」

言語によっては constrain() といった関数がある場合もありますが,ふつうは自分で用意する必要があります.
x = max(0, min(2, x)) などと書くことで簡潔に実装できます.

.Ⅲ. 計算量の推定

NN 回整数値の演算を行うだけなので,全体で O(K)O(K) です.

.Ⅳ. 発展

1)1) 類題

実装例

C++
Python
Java