SHAREOJ GUIDE
入出力生成と入力検証の使い方
テストケースをコードで作れます。ケース番号から入力を生成し、その入力を解答プログラムに渡して期待出力を揃えましょう。
ケース番号から入力を作る
問題作成画面のサイドバーで「生成と検証」を開き、種類を「入力生成」にします。開始ケース番号と生成件数を指定すると、番号を1ずつ増やしながら、各ケースについてプログラムを実行します。
現在の実装では、ケース番号は標準入力に整数1個と改行で渡されます。プログラムの第一引数ではなく、C++なら std::cin から読み取ってください。標準出力に書いた文字列が、新しいテストケースの入力になります。
たとえば「2つの整数の和」を求める問題なら、次のC++17プログラムで入力を作れます。
#include <iostream>
int main() {
long long case_number;
std::cin >> case_number;
std::cout << case_number << " " << case_number + 1 << "\n";
}開始ケース番号を7、生成件数を3にすると、次の3件が追加されます。既存のテストケースは残り、新しいケースの期待出力は空になります。
| 標準入力のケース番号 | 生成される入力 |
|---|---|
| 7 | 7 8 と改行 |
| 8 | 8 9 と改行 |
| 9 | 9 10 と改行 |
ケース番号ごとに最小値、最大値、重複する値などを出力する分岐を書けば、条件の異なる入力をまとめて用意できます。乱数を使う場合はケース番号をシードにすると、同じ番号から同じ入力を再現しやすくなります。
解答プログラムから期待出力を作る
種類を「出力生成」にすると、既存ケースの入力が標準入力へ渡されます。問題を解くプログラムを書き、その答えを標準出力へ出してください。
#include <iostream>
int main() {
long long a, b;
std::cin >> a >> b;
std::cout << a + b << "\n";
}入力が 7 8 なら、期待出力は 15 と改行になります。標準出力の空白と改行はそのまま保存されます。デバッグ用の表示は期待出力に混ざるため、標準出力には答えだけを書いてください。
出力生成の「開始位置」は、テストケース一覧の上から数えた位置です。1が先頭を表し、入力生成で使ったケース番号やファイル名とは別です。開始位置1、生成件数3なら、一覧の先頭3件の期待出力を置き換えます。
入力が制約を満たすか検証する
種類を「入力検証」にすると、指定した既存ケースの入力が標準入力へ渡されます。終了コード0で合格、0以外の終了コードや異常終了で不合格になります。標準出力は保存せず、入力と期待出力も変更しません。
次のC++17の例では、0以上10億以下の整数が2つだけあることを検証します。末尾の空白と改行は許可します。
#include <iostream>
int main() {
long long a, b;
if (!(std::cin >> a >> b)) return 1;
if (a < 0 || a > 1000000000 || b < 0 || b > 1000000000) return 1;
std::cin >> std::ws;
return std::cin.eof() ? 0 : 1;
}「開始位置」と「検証件数」で対象を指定し、「検証する」を押してください。ケースごとの結果が表示されます。時間超過(TLE)、メモリ超過(MLE)、出力超過(OLE)は「検証未完了」です。コードや実行条件を確認して再実行してください。
この例は整数の値と個数を検証します。行数や区切り文字まで厳密に指定する問題では、その形式もコードで検証してください。
画面で生成して確認する
- ログインして問題を開き、サイドバーの「生成と検証」を選びます。
- 「入力生成」で言語とコード、開始ケース番号、生成件数を設定し、「生成する」を押します。
- 完了したら「テストケースを確認」で入力を確認します。
- 「生成と検証」に戻り、「出力生成」で解答コードと対象範囲を設定します。
- 「生成する」を押し、期待出力を上書きする確認に同意します。完了後に入出力の組を確認してください。
入力生成・出力生成・入力検証のコードと言語はそれぞれ下書きに保存されます。公開済み・コンテスト登録済みの問題では、実行前の変更と生成結果を「保存」で保存してください。それ以外の下書きは自動保存されます。コンテストの採点内容は保存時に更新されます。単独の問題の採点への反映には問題一覧の「投稿」から公開するか、「問題管理」から公開内容を更新してください。
上限と失敗時の動作
- 入力と期待出力は、それぞれUTF-8で16 MiB(16,777,216バイト)までです。
- 既存データを含むテストケース全体は512 MiB、ケース数は100件までです。期待出力を置き換える場合、古い期待出力は置き換え後の合計に含めません。
- 各ケースの実行時間は5秒、メモリは512 MiB、ソースコードは64 KiBまでです。
- 生成件数は1〜100件、入力生成のケース番号は符号付き32ビット整数の範囲です。空の入出力も有効ですが、NUL文字や不正なUTF-8は使えません。
コンパイルエラー、実行エラー、時間超過、容量超過、ファイル検証の失敗がある場合は、結果を反映せず既存のテストケースを保持します。画面のエラーを確認し、コードや対象範囲を修正して再実行してください。
生成した答えも確認する
出力生成が正常終了しても、その答えが正しいとは限りません。解答コードの誤りが、そのまま期待出力になるためです。手計算できる小さなケースや、別の方法で求めた答えと照合してください。
入力が問題の制約を満たすかも確認します。この例は連続する2つの整数を作るだけなので、最小値や最大値を含むケースは問題に合わせて追加しましょう。