No.304 鍵(1)
タグ : / 解いたユーザー数 451
作問者 : koyumeishi
問題文
yukiくんは自転車の鍵の暗証番号を忘れてしまいました。
適当にyukiくんに番号を伝えて、なんとか解錠を手伝ってあげてください。
暗証番号は3桁の数字(000 ~ 999)です。
3桁の数字(先頭のゼロを含む)を標準出力に出力すると、
"locked" か "unlocked" のいずれかの文字列がジャッジから標準入力に返されます。
"locked" が返されたとき、鍵はまだ解錠できていません。別の数字を試しましょう。
"unlocked" が返されたとき、鍵は解錠できています。プログラムを終了してください。解錠したクエリより後に余計な出力があるとWAになります。
時間制限内なら何度でも挑戦可能です。
入出力
この問題はリアクティブ問題です。題意に従って入出力操作を行ってください。
特に各出力を改行してflushすることを忘れずに
リアクティブ問題の入出力に関する注意事項として、yukicoder wikiのリアクティブ形式の問題についてのまとめおよび、
No.246や
No.253等を参照してください。
ジャッジコード(参考)
ジャッジに使われるコードです。(C++、コマンドライン引数の1番目のファイルから答えの文字列を読み取る)
2016/05/04 : ジャッジコードを変更しました。 不正なフォーマット(数字以外の出力等)、一行に複数の出力、解錠後の余計な出力があるとWAになります。
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
string input(istream& is){
string ret;
getline(is, ret); //回答コードから受け取った文字列
assert(ret.size() == 3); //長さは 3
for(char c : ret){ //数字のみかチェック
assert('0' <= c && c <= '9');
}
return ret;
}
int main(int argc, char* argv[]){
ifstream ifs(argv[1]);
string ans = input(ifs); //第一引数のファイルから正解の文字列を取得
cerr << "Answer : " << ans << endl;
while(1){
string in = input(cin); //標準入力から回答の文字列を取得
if(in == ans){ //正解なら "unlocked" を出力して終了
cout << "unlocked" << endl;
if(getline(cin,in)){ //余計な出力がないか確認
cerr << "Wrong Answer : too many outputs, \"" << in << "\"" << endl;
abort();
}
return 0;
}else{ //不正解なら "locked" を出力
cout << "locked" << endl;
}
}
return 0;
}
サンプル
サンプル1
暗証番号
000
暗証番号が"000"であったときの入出力例です。
出力
003 002 001 000
入力
locked locked locked unlocked
4回目で解錠できました。
最初の3回の出力は暗証番号と一致しないので "locked" が返されています。
先頭のゼロを含め、3桁の数字を出力してください。
サンプル2
暗証番号
123
暗証番号が"123"であったときの入出力例です。
出力
120 121 122 123
入力
locked locked locked unlocked
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。