外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

SHAREOJ GUIDE

判定方法の設定

答えが複数ある問題や対話形式の問題は、判定コードで採点します。

判定方法を選ぶ

判定方法の設定。①判定方法のタブ、②判定方法、③判定コードの言語、④判定コードの形式

作問画面の「生成・検証・判定」で①「判定方法」を開き、②で判定方法を選びます。

判定方法 使う場面
通常判定(空白区切りで比較) 答えが1通りに決まる問題。出力と期待される出力を比べます。
スペシャルジャッジ 答えが複数ある問題や、小数の誤差を認める問題。検証コードが提出の出力を判定します。
インタラクティブ(対話形式) 提出と対話しながら進める問題。対話用ジャッジが提出とやり取りして判定します。

通常判定の比べ方は、提出と判定結果で説明しています。

スペシャルジャッジとインタラクティブでは、③で判定コードの言語を選び、コードを入力します。 言語は、解答の言語と同じでなくてもかまいません。 ④で「testlib形式(Codeforces互換)」を選べるのは、言語がC++23(GCC)とC++23(Clang)のときだけです。 判定コードは公開しません。

現行形式の検証コード

検証コードは、テストケースごとに提出の出力を受け取り、終了コードで結果を返します。

  • 標準入力:提出の出力
  • 第1引数:テストケースの入力ファイル
  • 第2引数:期待される出力のファイル(空でもかまいません)
  • 第3引数:提出のソースコードのファイル
  • 第4引数:スコアのファイル(「集計コードで採点する」をオンにした問題でだけ読みます)

終了コードが0なら正解、それ以外なら不正解です。 異常終了した場合も不正解になり、標準出力の内容は使いません。

次の例は、提出の出力と期待される出力をそれぞれ小数として読み、絶対誤差または相対誤差が 10−610^{-6} 以下なら正解とします。 値のあとに余分な出力があれば不正解です。

#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
    std::ifstream answer(argv[2]);
    double expected, actual;
    answer >> expected;
    if (!(std::cin >> actual)) return 1;
    std::string extra;
    if (std::cin >> extra) return 1;
    return std::abs(actual - expected) <= 1e-6 * std::max(1.0, std::abs(expected)) ? 0 : 1;
}

検証コードは、提出が正常に終了したケースだけで実行します。

testlib形式

testlib形式では#include "testlib.h"を使えます。 infはテスト入力、oufは提出の出力、ansは正解ファイルを読みます。 次は、整数を1つずつ読んで比べるcheckerです。

#include "testlib.h"
int main(int argc, char** argv) {
  registerTestlibCmd(argc, argv);
  int actual = ouf.readInt();
  int expected = ans.readInt();
  if (actual != expected) quitf(_wa, "different answer");
  quitf(_ok, "accepted");
}

対話形式ではregisterInteractionで初期化します。 次の例は、入力ファイルの整数を提出へ送り、その2倍が返ることを確かめます。

#include "testlib.h"
#include <iostream>
int main(int argc, char** argv) {
  registerInteraction(argc, argv);
  int n = inf.readInt();
  std::cout << n << std::endl;
  int actual = ouf.readInt();
  if (actual != 2 * n) quitf(_wa, "expected twice n");
  quitf(_ok, "accepted");
}

_okはAC、_wa、_pe、_dirt、_unexpected_eofはWA、_failはJEです。 quitpは「集計コードで採点する」をオンにした問題でだけ使え、_pcには対応していません。 現行形式と違い、判定コードが異常終了した場合はJEになります。 toutの内容を別のcheckerで判定する処理はないので、interactor自身で正誤を決めてください。

インタラクティブ問題

提出と対話用ジャッジを同時に実行し、互いの標準入出力をつなぎます。 テストケースの入力は提出へ自動では送らないので、対話用ジャッジが入力ファイルを読み、必要な情報を提出へ出力してください。 現行形式の対話用ジャッジは、検証コードと同じ4つの引数を受け取ります。 提出も対話用ジャッジも、相手の応答を待つ前に出力をフラッシュしてください。

  • 提出がTLE、MLE、OLE、REになった場合は、その結果になります。
  • 対話用ジャッジが正常に終了し、提出も終了すると正解です。現行形式では、対話用ジャッジが0以外の終了コードで終了すると不正解です。testlib形式では、testlib形式と同じ規則で扱います。
  • 対話全体の経過時間の上限は、実行時間制限に5秒を足した長さの3倍に1秒を足した長さです。

Rubyで解くときの注意は、使える言語と実行環境の仕様に書いています。

集計コード

部分点採点で「集計コードで採点する」をオンにした問題では、判定コードがケースごとに整数の点を返せます。 現行形式では、ACかWAのケースでスコアのファイルに書いた0〜101810^{18}の整数を読みます。 空なら点なしで、それ以外の内容は提出全体がJEになります。 testlib形式では、quitpに0〜1,000,000の整数を渡すと、ACとしてその点を付けます。 小数のquitpと_pcはJEです。

集計コードは、すべてのケースのあとに1回だけ実行し、グループごとの得点を決めます。

  • 標準入力:1行目にケース数 NN とグループ数 GG、次の GG 行に各グループの配点、次の NN 行に各ケースの「判定 点 サンプル 所属の数 グループ番号…」。判定はAC、WA、TLE、MLE、OLE、RE、SKIPPED(未実行)のどれかで、点がなければ-、サンプルは1か0、グループ番号は0から数えます。
  • 標準出力:各グループの得点を1行ずつ、0以上その配点以下の10進の小数で書きます。小数第3位以下は切り捨てます。

次の例は、各グループの得点を「配点×属するケースの点(0〜100)の最小÷100」にします。 点のないケースは、ACなら100、それ以外なら0とみなします。

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>

int main() {
    int n, g;
    std::cin >> n >> g;
    std::vector<long long> points(g), ratio(g, 100);
    for (auto& p : points) std::cin >> p;
    for (int i = 0; i < n; i++) {
        std::string verdict, score;
        int sample, k;
        std::cin >> verdict >> score >> sample >> k;
        long long value = score != "-" ? std::min(std::stoll(score), 100LL) : verdict == "AC" ? 100 : 0;
        for (int j = 0; j < k; j++) {
            int group;
            std::cin >> group;
            ratio[group] = std::min(ratio[group], value);
        }
    }
    for (int j = 0; j < g; j++) {
        long long hundredths = points[j] * ratio[j];  // 100倍した得点
        std::printf("%lld.%02lld\n", hundredths / 100, hundredths % 100);
    }
}

集計コードの上限は判定コードと同じで、失敗や書式違いは提出全体がJEになります。

判定コードの上限と診断

判定コードは、各ケースでCPU時間5秒、メモリは検証コードが512 MiB、対話用ジャッジが256 MiBまでです。 上限を超えた場合や、コンパイルに失敗した場合は、提出全体がJEになります。

判定コードと集計コードが標準エラー出力に書いた内容は、提出結果の「ジャッジコードの診断(作問者のみ)」に表示し、問題の作者とテスターだけが見られます。 ただし、インタラクティブ問題のサンプル検証では、対話の記録と対話用ジャッジの標準エラー出力を、提出した人にも表示します。 サンプルケースで、解答の手がかりになる情報を標準エラー出力に書かないでください。