はじめに
2024 年 1 月 4 日、 MojaCoder に新しく スペシャルジャッジ が導入されました!
Python でスペシャルジャッジの記述方法の解説がなかったため (yukicoder での解説があったくらい) 、このような記事を作成しました。
新しい機能を使って作問をしてみたい 作問er の方のお役に立てれば幸いです。
目次
- はじめに
- 目次
- 仕様
- 実装例
- チートシート
仕様
スペシャルジャッジの仕様には以下のようなものがあります。
参考:MojaCoderスペシャルジャッジ仕様 (お茶の葉 様)
- 正誤判定はジャッジプログラムが正常終了かどうか、すなわち
RE
でないかどうかで判定されます。
これにより、assert
文を使って条件を満たさない場合に例外を発生させたり、 raise
文を使って例外を発生させたり、内部的に例外を発生させることにより、 WA
と判定させることになります。
例外を踏まず、正常終了した場合は AC
となります。
- ジャッジプログラムが
TLE
,MLE
,CE
の場合は、JTLE
,JMLE
,JCE
と判定されます。
一般公開した場合やコンテスト中に JTLE
, JMLE
, JCE
が発生することは好ましくありません。
そのようなジャッジコードが出ないよう、十分にデバッグを行うよう努めましょう。
ジャッジのバグが発生しないようにするためにも、出力制限に気を付けて作問するべきでしょう。
文字数も問題の判定の要素の場合は $N+1$ 文字で制限するなどで検討してください。
- 第 1 引数にテストケース入力ファイルパス、第 2 引数にテストケース出力ファイルパスが与えられます。
つまり、こう言うことです。
- 標準入力に提出解答の出力が与えられます。
提出プログラムの実行が行われて出力が終わった後に、その出力結果に対して評価を行うことになります。
- 標準出力、標準エラー出力は使用しません。
- メモリ制限は $1 \ \mathrm{GiB}$ 、実行時間制限は $3 \ \mathrm{sec}$ です。
問題を解くとき同様、ジャッジプログラムのメモリ制限や実行時間制限にも注意しましょう。
実装例 (Python)
次のような問題を実装することを考えます。
問題リンク (MojaCoder)
問題文
整数 $N$ が与えられます。 $A + B = N$ となる $0$ 以上の整数 $A, B$ を出力してください。
N
A B
スペシャルジャッジ実装例
import sys
with open(sys.argv[1]) as in_testcase, open(sys.argv[2]) as out_testcase:
# 入力ファイルから N を読み込む.
N = int(in_testcase.readline())
# 提出解答の出力から A, B を読み込む.
A, B = map(int, input().split())
# 与えられた A, B が条件を満たすか判定する.
assert A >= 0 and B >= 0
assert A + B == N
# 標準入力が空であることを確認する.
try:
input()
raise AssertionError
except EOFError:
pass
※ 最後の標準入力が空であることの確認がないと、末尾に不要な文字列がある解答も AC
と判定されてしまいます。
チートシート
以下、チートシートです。
import sys
with open(sys.argv[1]) as in_testcase, open(sys.argv[2]) as out_testcase:
# ここからジャッジ用のコードを書く
# ~~~
INPUT = in_testcase.readline() # 入力ファイルから
OUTPUT = out_testcase.readline() # 出力ファイルから
SUBMIT = input() # 提出解答から
assert X == Y # X と Y が等しい場合通過、そうでない場合例外発生 (WA)
try:
input()
raise AssertionError
except EOFError:
pass