No.305 鍵(2)
レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限
: 256 MB / リアクティブ問題 (詳しくはこちら)
タグ : / 解いたユーザー数 222
作問者 : koyumeishi
タグ : / 解いたユーザー数 222
作問者 : koyumeishi
問題文最終更新日: 2016-05-04 21:11:05
問題文
yukiくんは金庫の鍵の暗証番号を忘れてしまいました。
適当にyukiくんに番号を伝えて、なんとか解錠を手伝ってあげてください。
暗証番号は10桁の数字(0000000000 ~ 9999999999)です。
10桁の数字(先頭のゼロを含む)を標準出力に出力してください。
出力が暗証番号と異なる場合、
X lockedがジャッジから標準入力に返されます。 ここで$X$は金庫の暗証番号と一致した数字の数です。
鍵はまだ解錠できていないので、$X$を参考に別の数字を試しましょう。
出力が暗証番号と一致する場合、
10 unlockedがジャッジから標準入力に返されます。
鍵が解錠出来たのでプログラムを終了してください。解錠したクエリより後に余計な出力があるとWAになります。
時間制限内なら何度でも挑戦可能です。 (7000クエリ程度でTLEになるそうです)
入出力
この問題はリアクティブ問題です。題意に従って入出力操作を行ってください。
特に各出力を改行して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() == 10); //長さは 10
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){ //正解なら "10 unlocked" を出力して終了
cout << "10 unlocked" << endl;
if(cin >> in){ //余計な出力がないか確認
cerr << "Wrong Answer : too many outputs" << endl;
abort();
}
return 0;
}else{ //不正解なら "locked" を出力
int x = 0;
for(int i=0; i<10; i++){
x += ans[i] == in[i];
}
cout << x << " locked" << endl;
}
}
return 0;
}
サンプル
サンプル1
暗証番号
0000000001
暗証番号が"0000000001"であったときの入出力例です。
出力
1234567890 0000000000 0000000001
入力
0 locked 9 locked 10 unlocked
1回目の入力で暗証番号と一致している数字は0個です。
2回目の入力では頭の9個の0が一致しています。
3回目で解錠できました。
先頭のゼロを含め、10桁の数字を出力してください。
サンプル2
暗証番号
1234567890
暗証番号が"1234567890"であったときの入出力例です。
出力
0000000000 9999999999 1234500000 1234567899 1234567890
入力
1 locked 1 locked 6 locked 9 locked 10 unlocked
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。