えびちゃんの日記

えびちゃん(競プロ)の日記です。

あとでなおす

競プロをしていて、一時的に値を決めておくけれども、提出時には直したいということがあるかもしれません。何らかの理由で。

int m = 10;  // to be edited

実際には m は入力によって変えるべきだけれども、手元のデバッグなどの都合では定数の方が楽、とかがあるかもしれません。 で、直さずに提出してしまうと WA なり RE なり TLE なりになって、ペナが生えてしまいます。

CE ではペナが生えないので、以下を満たす書き方を目標とします。

  • 手元では動く
  • 提出すると CE になる

あと、C++ を考えます。Rust でも頭をひねればできるんじゃないかな。

前提知識

AtCoderCodeforces では、ジャッジ環境において 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 が定義されていることになります。

ねこ

こんな感じでいいですか?

追記