競プロをしていて、一時的に値を決めておくけれども、提出時には直したいということがあるかもしれません。何らかの理由で。
int m = 10; // to be edited
実際には m
は入力によって変えるべきだけれども、手元のデバッグなどの都合では定数の方が楽、とかがあるかもしれません。
で、直さずに提出してしまうと WA なり RE なり TLE なりになって、ペナが生えてしまいます。
CE ではペナが生えないので、以下を満たす書き方を目標とします。
- 手元では動く
- 提出すると CE になる
あと、C++ を考えます。Rust でも頭をひねればできるんじゃないかな。
前提知識
AtCoder と Codeforces では、ジャッジ環境において ONLINE_JUDGE
が #define
されます。
AOJ ではこれがされないはずなので、別途考えます。
で、#ifdef neko
というのによって、neko
が #define
されているかどうかが分岐できます。
あるいは #if defined(neko)
でもよいです。
#ifdef ONLINE_JUDGE // ジャッジ側ではコンパイルされる #else // 手元ではコンパイルされる #endif
AOJ ではこれがされないので、手元で適当なマクロを #define
するといいです。
#define
をコード中で行うと提出時に書き換える必要があってペナの原因になるので、コンパイルオプションで変えるとよいです。
% g++ neko.cpp -DLOCAL
オプション -Dneko
をつけることで、neko
が #define
された状態にできます。
手元ではそうやってコンパイルすることにして、それを使って #ifdef
で分岐できるようにしておけばよいです。
AOJ にも対応させられるようにするなら、AtCoder たちについてもこれを使う方が楽だと思います(分けなくて済むので)。
実装
以下のように書けることを目標とします。
int m = tbe(10);
こう書くと、手元では m = 10
として動いて、ジャッジでは CE になってほしいです。
以下のような関数を書いてみましょう。
#if !defined(ONLINE_JUDGE) template <typename Tp> Tp tbe(Tp const& x) { return x; } #endif
AOJ で使うなら、こうです。
#ifdef LOCAL template <typename Tp> Tp tbe(Tp const& x) { return x; } #endif
これをすることで、手元でだけ tbe
が定義されていることになります。
ねこ
こんな感じでいいですか?
追記
tbe() は (手元で実行したい値, 提出するときに使いたい値) という pair にして、# ifdef でどっちを代入するかを決めると編集の必要がなくなる? https://t.co/800PCLzsEh
— tsutaj (@tsutaj) 2020年10月30日
constexpr int oj_local(int oj, int local) {
— 熨斗袋 (@noshi91) 2020年10月30日
# ifdef ONLINE_JUDGE
return oj;
# else
return local;
# endif
}
とかで良いんじゃないだろうか