No.5000 特殊ジャッジテスト(テスト用)
タグ : / 解いたユーザー数 200
作問者 :
作問者向けNote 2026/04/13 更新
スペシャルジャッジ・リアクティブの検証コードの実行の仕様です。 実行コマンド (問題の入力ファイルパス) (問題の出力ファイルパス) (提出されたソースコードのパス) (スコアファイルのパス)
(標準入力に提出コードでの標準出力が渡される)
実行コマンドの例です。
./a.out test_in/1.txt ans/1.txt main.ws score/1.txt < out/1.txt
検証コードで気をつけないといけないのは、提出コードでの標準出力には言語によりCR(改行コード: キャリッジリターン)が含まれる可能性があるので、可能な限りケアするようにしてください。
特にC++のstd::getline はジャッジ環境ではCRを解釈してくれません。
参考 std::getlineについての覚書
同じように他のCRを考慮しないものがあればご提案ください。
検証コードがランタイムエラー(Exit Codeが
0以外。例えばassertなどで終了)になるとWAになります。検証コードがTLEすると
J_TLEになりますが、なるべくならないようにしてください。リアクティブジャッジの場合、検証コードがランタイムエラーかつ、ユーザーコードがTLEの時は
WAになります。Exit Codeを
100としてプログラムを終了させるとQLEになります。(2019/11/14 追加 暫定案)その他
REやTLEなどの判定は通常のチェッカーが使われます。スペシャルジャッジ・リアクティブどちらもテスト出力ファイルをおいてください。空ファイル(0バイトのファイル)で十分ですが、 解の1例をおいておくと良いかもしれません。
リアクティブ問題の(検証コードに対する)入力は、問題の「テスト入力ファイル」においてください。
検証コードでの標準エラー出力は自由に出してもらっても構いません。
リアクティブ問題に関して
リアクティブ問題は純コード判定は行われません。
コミュニケーション問題に関して
コミュニケーション問題はリアクティブ形式の一種で、同じプログラムが2プロセスで動作します。
ジャッジコード(検証コード)が各プロセスの入出力をパイプで仲介し、プロセス間の通信を制御します。
パイプ構成
コミュニケーション問題では、ジャッジプロセスに以下のファイルディスクリプタ(FD)が割り当てられます。
プロセス1 (stdout) --→ FD3 (ジャッジからの読み取り)
プロセス1 (stdin) ←-- FD4 (ジャッジからの書き込み)
プロセス2 (stdout) --→ FD5 (ジャッジからの読み取り)
プロセス2 (stdin) ←-- FD6 (ジャッジからの書き込み)
| FD | 方向 | 接続先 | 用途 |
|---|---|---|---|
FD3 | 読み取り | プロセス1 の stdout | プロセス1 が出力したデータをジャッジが読む |
FD4 | 書き込み | プロセス1 の stdin | ジャッジからプロセス1 にデータを送る |
FD5 | 読み取り | プロセス2 の stdout | プロセス2 が出力したデータをジャッジが読む |
FD6 | 書き込み | プロセス2 の stdin | ジャッジからプロセス2 にデータを送る |
参考: FD0〜2はリアクティブと同様です。FD0(stdin)にはテスト入力ファイルの内容、FD1(stdout)・FD2(stderr)はジャッジコードの出力用です。
ジャッジコードはFD3〜FD6を使って2つのユーザープロセスと通信します。
通常の標準入力(FD0)にはリアクティブと同様にテスト入力ファイルの内容が渡されます。
引数もリアクティブと同じ形式です。
ユーザープロセスは通常通り標準入力(stdin)から読み、標準出力(stdout)に書きます。
FD番号を意識するのはジャッジコード側のみです。
ジャッジコードの実装例(Python)
import os, sys
# FD3-6でユーザープロセスと通信
user1_read = os.fdopen(3, 'r') # プロセス1の出力を読む
user1_write = os.fdopen(4, 'w') # プロセス1に入力を送る
user2_read = os.fdopen(5, 'r') # プロセス2の出力を読む
user2_write = os.fdopen(6, 'w') # プロセス2に入力を送る
# テスト入力は標準入力から
test_input = sys.stdin.read()
# プロセス1に初期データを送信
user1_write.write("1 ...\n") # プレイヤー1の入力
user1_write.flush()
# プロセス2に初期データを送信
user2_write.write("2 ...\n") # プレイヤー2の入力
user2_write.flush()
# 以降、両プロセスの出力を読み取り、相手に転送するなどの処理を行う
コミュニケーション問題のジャッジコード実装では、以下の点に注意してください。
- FD3〜FD6を使用する(標準入出力はテストファイル用)
- 書き込み後は必ず
flush()する - 1つのプロセスが不正な出力をした場合、他のプロセスがデッドロックしないよう配慮する
- メモリ使用量は2つのユーザープロセスの最大値で判定される
- どちらかのユーザープロセスが異常終了した場合、その終了コードが使われる
コミュニケーション問題は純コード判定は行われません。
スコアについて(β)
問題編集ページで問題の種類を「スコア問題」に選択すると、問題ページ上部に「スコア順」のタブが現れます。「スコア順」タブはACになっている提出で、各ユーザーの最高点の提出(かつ提出IDが小さい提出)が表示されます。
スコア問題では、暫定的に提出制限を設けており、同じ問題の最後の提出(CE以外)から5分以内に提出できないようにしております。
この時に、スコアファイルに出力した値がスコアとして、各テストケースの合計として集計されます。
スコアファイルは、64ビット符号付き整数の値を出力してください。(末尾改行も許容)
(合計もオーバーフローしないように気をつけてください。)
64ビット整数値を使えますが、桁が多いと見にくいので多くても9桁あたりが望ましいと思います。
スコアを小さい順で表したいときは、その旨を問題文に明記して、マイナスをかけるといいかと思います。
大抵は何も意識せずにファイルを開き書き込めばいいと思いますが、「その他ユーザー」に書き込み権限を与えないように気をつけてください。
なお、「スコア問題」にすると自動的に「ACで公開」はしないになります。
スコア問題の難易度は0で良いと思います。
スコア問題は純コード判定は行われません。
問題文
整数$N$が与えられるので
$A+B=N$となる、整数$A,B$を出力してください。
ただし、想定の答えと同じだと不正解になる。
(ヒント:想定の答えは必ず$A=1$であるようだ。)
さらにソースコード中に"random"という文字があると間違いとなる。
(制限ジャッジのテスト)
また、各ケース1000 - コード長の合計がスコアになる。
ただし$A,B$は、
$-2147483648 \le A,B \le 2147483647$
の範囲とする。
入力
N
入力は整数で与えられる。
$-1000 \le N \le 1000=10^3$
出力
A B
$A+B=N$になるような$A,B$をこのフォーマットに合うように出力してください。
サンプル
サンプル1
入力
5
出力
2 3
2+3=5
です。
サンプル2
入力
10
出力
10 0
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。