問題一覧 > 通常問題

No.304 鍵(1)

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 256 MB / リアクティブ問題 (詳しくはこちら
タグ : / 解いたユーザー数 451
作問者 : koyumeishikoyumeishi
6 ProblemId : 765 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2017-06-25 01:09:57

問題文

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

暗証番号は3桁の数字(000 ~ 999)です。 3桁の数字(先頭のゼロを含む)を標準出力に出力すると、 "locked" か "unlocked" のいずれかの文字列がジャッジから標準入力に返されます。
"locked" が返されたとき、鍵はまだ解錠できていません。別の数字を試しましょう。
"unlocked" が返されたとき、鍵は解錠できています。プログラムを終了してください。解錠したクエリより後に余計な出力があるとWAになります。
時間制限内なら何度でも挑戦可能です。

入出力

この問題はリアクティブ問題です。題意に従って入出力操作を行ってください。 特に各出力を改行して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() == 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もしくは右上の雲マークをクリックしてアカウントを作成してください。