No.305 鍵(2)

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 256 MB / リアクティブ問題 (詳しくはこちら
タグ : / 解いたユーザー数 130
作問者 : koyumeishikoyumeishi

3 ProblemId : 768 / 出題時の順位表

問題文

yukiくんは金庫の鍵の暗証番号を忘れてしまいました。 適当にyukiくんに番号を伝えて、なんとか解錠を手伝ってあげてください。

暗証番号は10桁の数字(0000000000 ~ 9999999999)です。 10桁の数字(先頭のゼロを含む)を標準出力に出力してください。
出力が暗証番号と異なる場合、

X locked
がジャッジから標準入力に返されます。 ここで$X$は金庫の暗証番号と一致した数字の数です。
鍵はまだ解錠できていないので、$X$を参考に別の数字を試しましょう。

出力が暗証番号と一致する場合、
10 unlocked
がジャッジから標準入力に返されます。
鍵が解錠出来たのでプログラムを終了してください。解錠したクエリより後に余計な出力があるとWAになります。

時間制限内なら何度でも挑戦可能です。 (7000クエリ程度でTLEになるそうです)

入出力

この問題はリアクティブ問題です。題意に従って入出力操作を行ってください。
特に各出力を改行してflushすることを忘れずに
リアクティブ問題の入出力に関する注意事項として、yukicoder wikiのリアクティブ形式の問題についてのまとめおよび、 No.246No.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
提出ページヘ