ループと条件分岐などを組み合わせて,与えられた課題を正確に実装しましょう.
少しの工夫で楽をすることもできます.
問題原案:@machoniump
past
, now
, future
をそのまま用いて,条件分岐などで行動を表すことも可能ですが,若干冗長になってしまいます.
そこで,もう少し表現の仕方を工夫してみましょう.
与えられた行動は, つの世界を左からそれぞれ のような数値に対応させると,次のように考えることができます.
B
なら, から を引く.G
なら, に を足す.課題をこのように捉えることで,実装を簡潔にまとめることができます.
より厳密には, が 未満なら を に, 既超なら にします.
基本的には上記のことをそのまま実装するだけですが,if
などを極力使わずに短い式で記述する方法もあります.
具体的には,多くの言語にある「三項演算子」を利用します.(詳細は各言語のリファレンス等を参照してください.)
実際のコードは次の「実装例」項にあります.
言語によっては constrain()
といった関数がある場合もありますが,ふつうは自分で用意する必要があります.
x = max(0, min(2, x))
などと書くことで簡潔に実装できます.
回整数値の演算を行うだけなので,全体で です.
xxxxxxxxxx
using namespace std;
int main() {
int K; cin >> K;
string C; cin >> C;
int x = C == "past" ? 0 : ( C == "now" ? 1 : 2 );
for(int i=0; i<K; ++i) {
char m; cin >> m;
x += m == 'B' ? -1 : 1;
x = max(0, min(2, x));
}
cout << (const char*[]){ "past", "now", "future" }[x] << "\n";
return 0;
}
xxxxxxxxxx
K, C = input().split()
S = input()
worlds = ["past", "now", "future"]
x = worlds.index(C)
for s in S:
x += -1 if s == "B" else 1
x = max(0, min(2, x))
print(worlds[x])
xxxxxxxxxx
interface Main{
static void main(String[] $){
var scanner = new java.util.Scanner(System.in);
String[] worlds = { "past", "now", "future" };
int K = scanner.nextInt(), x = java.util.Arrays.asList(worlds).indexOf(scanner.next());
for(var m : scanner.next().split("")) x = m.equals("B") ? Math.max(x - 1, 0) : Math.min(x + 1, 2);
System.out.println(worlds[x]);
}
}