スペシャルジャッジの実装例
Latest Author 👑実装例
例えば、以下の問題のスペシャルジャッジを作る場合を考えます。
整数 $N$ が与えられる。次の条件を満たす 2 つの整数 $A$, $B$ を半角スペース区切りで出力せよ。
$N = A + B$
#include <bits/stdc++.h> int main(int argc, char** argv) { // テストケースの入力ファイルの input stream std::ifstream input_ifs(argv[1]); // テストケースの出力ファイルの input stream std::ifstream output_ifs(argv[2]); // 提出されたコードのファイルの input stream std::ifstream code_ifs(argv[3]); // スコアファイル(スコア問題のみ利用)の output stream std::ofstream score_ofs(argv[4]); // 標準入力(std::cin)に提出コードでの標準出力が渡される // ------ // 「提出コードでの標準出力」から2つの整数を読み込む // 半角スペース区切り・改行区切りのどちらでも可 int a, b; std::cin >> a >> b; // int型なので、32bit整数で表現出来ない数値は読み込めない // 脆弱性を突かれないためにも、制約を決めて、問題文に記載するべき。 // 例えば、-100以上100以下の整数しか受け付けない場合、以下のように記述すれば良い。 // abortは、メッセージを標準エラーに出力して異常終了(コード1)する関数。 if (-100 > a || a > 100) abort("invalid a"); if (-100 > b || b > 100) abort("invalid b"); // 「テストケースの入力ファイル」から1つの整数を読み込む int n; input_ifs >> n; // a + b == n でないならば if (a - n != -b) { // Wrong Answer として、ジャッジプログラムを終了する。 // メッセージを記載しておくと、デバッグしやすい。 std::cerr << "a=" << a << ", b=" << b << ", n=" << n << std::endl; abort("Wrong Answer: a + b = n"); } // assertを使って以下のように記載しても良い。 // ただしassertは、コンパイル時のマクロ定義によっては無効化されることがある。 // assert(a - n == -b); // 正解なので、正常終了する。 return 0; }
また、スペシャルジャッジ問題の場合、入力制約のみならず、出力制約にも気を配りましょう。
文字列を受け取る場合std::setw
を使い、入力数を制限することも検討してください。https://cpprefjp.github.io/reference/iomanip/setw.html
特にユーザーコードがバグにより異常に多い出力になってしまった場合で
TLE
にならないまま ジャッジ側に渡された場合J_TLE
と言われる場合があります。通常の問題の場合
J_TLE
と出るのは好ましくないです。 文字数も問題の判定の要素の場合は
N+1
文字で制限するなどで検討してください。ランダムに
J_TLE
が出る場合は、ジャッジサーバーの増強を考えますのでご連絡ください。
その他の言語の実装例
Python3
きっと誰かが書いてくれます
Ruby
あとで書きます