Skip to content

IOラッパー

概要

  • 自前でローカルテスターを移植したりする場合など、ローカルテスター用の入出力と提出時の入出力が異なったりする
  • 入出力部分をラップし、ローカルの時と提出時の違いを吸収する
  • また、ローカルテスター部分は、何個も解を作って一番良いのを返す、ような使い方もできる

Reference

コードメモ

// ゲーム情報
struct Game {
    // ...

    void init() {
    }
};

// ローカルテスター
struct LocalTester {
    // ...

    void init(Game& game) {
        // ...
    }

    int get_score() {
        return 0;
    }
};

struct IO {
    virtual Game init() = 0;
    virtual void op1() = 0;
    virtual int op2(int x) = 0;
    virtual int answer(int ans) = 0;
};

class JudgeIO : public IO {
    Game init() override {
        cerr << "JudgeIO" << endl;
        Game game;
        game.init();
        return game;
    }
    void op1() override {
        // ...
    }
    int op2(int x) override {
        // ...
        return 0;
    }
    int answer(int ans) override {
        // ...
        return 123;
    }
};

class LocalIO : public IO {
    LocalTester local_tester;

    Game init() override {
        cerr << "LocalIO" << endl;
        Game game;
        game.init();
        local_tester.init(game);
        return game;
    }
    void op1() override {
        // ...
    }
    int op2(int x) override {
        // ...
        return 0;
    }
    int answer(int ans) override {
        return local_tester.get_score();
    }
};

int main() {
#ifdef LOCAL
    shared_ptr<IO> io = make_shared<LocalIO>();
#else
    shared_ptr<IO> io = make_shared<JudgeIO>();
#endif
    Game game = io->init();

    return 0;
}