スペシャルジャッジの実装例

Latest Author 37zigen37zigen /Date 2020-10-16 10:59:14 / Views 756
3 (Favした一覧ページはユーザーページから)

仕様についてはこちらを参照

実装例

例えば、以下の問題のスペシャルジャッジを作る場合を考えます。

整数 $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以下の整数しか受け付けない場合、以下のように記述すれば良い。
  if (-100 > a || a > 100) assert("invalid a");
  if (-100 > b || b > 100) assert("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;
    assert("Wrong Answer: a + b = n");
  }
  
  // 正解なので、正常終了する。
  return 0;
}

また、スペシャルジャッジ問題の場合、入力制約のみならず、出力制約にも気を配りましょう。

文字列を受け取る場合 std::setw を使い、入力数を制限することも検討してください。
https://cpprefjp.github.io/reference/iomanip/setw.html
特にユーザーコードがバグにより異常に多い出力になってしまった場合でTLEにならないまま ジャッジ側に渡された場合J_TLE と言われる場合があります。
通常の問題の場合J_TLEと出るのは好ましくないです。
文字数も問題の判定の要素の場合はN+1文字で制限するなどで検討してください。
ランダムにJ_TLEが出る場合は、ジャッジサーバーの増強を考えますのでご連絡ください。

その他の言語の実装例

Python3

きっと誰かが書いてくれます


Ruby

あとで書きます


Go

こちら