第3回 問題を解いて、プログラムを提出してみよう|Tech Book Zone Manatee

マナティ

新しくなったAOJでプログラミングチャレンジ!

第3回 問題を解いて、プログラムを提出してみよう

AOJ(Aizu Online Judge:onlinejudge.u-aizu.ac.jp/home)は誰でも無料で利用できるプログラミング問題のオンライン採点システムです。プログラミングスキルを磨きたい方、レベルアップに最適。この冬、リニューアルした「新AOJ」について紹介していきます。

前回はAOJへのユーザ登録と問題の検索について解説しました。今回は、いよいよオンラインジャッジシステムを用いたプログラミング学習の本質的な活動について解説します。問題を解いて、プログラムを提出してみましょう!

問題ページの構成

問題ページへアクセスするための方法については前回の記事をご覧ください。



ファインダーや検索ページで、上のような問題カード(リンク)を選択すると、以下のような問題ページが開きます。(今回はチャレンジの基礎的な問題から「0358買い物」(https://onlinejudge.u-aizu.ac.jp/#/problems/0358)を例題としてとりあげます)

まずは問題ページのおおまかな構成から確認しましょう。問題ページは主に以下のパーツから構成されています。

  • ① 問題文: 問題の内容が書かれています。
  • ② コーディングフォーム: コーディングを行い(または作成したコードを張り付け)、プログラムをジャッジに提出するエリアです。
  • ③ ステータスビュー: プログラムを提出した直後に、ジャッジからの返答を確認するビューです。
  • ④ テストケース(TEST CASE)ビュー: ジャッジが完了した後に、各テストケースに対する判定結果とジャッジデータを確認するビューです。
  • ⑤ フッタ: 解答リストや統計など、当該問題に関する補助的な情報へのリンクがまとめられています。




以下、それぞれのパーツの詳細を実際の手順にそって見ていきます。

問題文を読む

オンラインジャッジやプログラミングコンテストの各問題は、「課題について、与えられた入力に対して正しい出力を(必要であれば効率的に)行うプログラムを作成せよ」という出題形式になっています。具体的には、問題文は主に以下の項目から構成されています。

  • ①-1 ヘッダ:主に問題に関する制限事項が書かれています。Time Limit、Memory Limitはそれぞれ、問題を解答するために利用できるCPUの時間とメモリ量です。サーバー側(ジャッジ側)で提出プログラムの実行時間やメモリ使用量がこれらの値を超えてしまうと不正解となります。アルゴリズムを設計する際の参考にします。
  • ①-2 問題文:問題の内容が書かれている本文です。背景や物語を交えながら、プログラムが満たすべき仕様が明確に記述されています。
  • ①-3 入力(Input): 問題の入力に関する説明が書かれています。プログラムはここで定義されている入力形式で入力データを読み込まなければなりません。特に指定がない限り「標準入力」から読み込みます。
  • ①-4 出力(Output): 問題の出力に関する説明が書かれています。プログラムはここで定義されている形式で出力を行わなければなりません。特に指定がない限り「標準出力」へ出力します。プロンプトメッセージなど余分な文字列を出力してしまうと不正解となるので注意しましょう。また、余分な空白・改行を出力する、あるいは必要な空白・改行が不足している場合も出力形式の誤りとして不正解になります。
  • ①-5 入出力例(Sample Input X, Sample Output X): 入力例は、ジャッジデータとして与えられる入力のであり、入出力の形式や考えられるパタンをより具体的に確認するためのものです。出力例は入力例に対する正しい出力を示します。※出力例と一致したプログラムが正解になるとは限らないことに留意してください。提出されたプログラムはより厳格でサイズが大きいデータを用いて判定されます。

(これらの他に、問題文には解説を開くためのセクションがあります。解説の閲覧については、次回詳しく紹介します。)

プログラムを提出する

問題を読解したら、アルゴリズムを考え、実際にコーディングしてみましょう。

「②コーディングフォーム」は、解答コードをジャッジシステムに提出するためのフォームで、主に以下のパーツから構成されています。

  • ②-1 プログラミング言語選択:提出するプログラムの言語を選択します。デフォルトであらかじめ登録された言語が設定されます。現在AOJでは以下のプログラミング言語に対応しています。C, C++, C++11, C++14, JAVA, C#, Python, Python3, Scala, Go, Rust, JavaScript, Ruby, PHP, D, OCaml, Haskell, Kotlin
  • ②-2 エディタ: 解答プログラムを記述するテキストエリアです。プログラムを作成したツールなどからソースコードをコピー&ペーストして貼り付けます。テキストエリアは簡易的なエディタになっていますので、ブラウザ上から直接コーディングを行うこともできます。(※上図では、例としてあらかじめコードが埋め込まれています)
  • ②-3 Submit(提出)ボタン: ジャッジに解答プログラムを送信します。

プログラムが完成したら(貼り付けたら)、エディタ右下のSubmit(提出)ボタンを押してプログラムを提出してみましょう。(提出するにはサインインが必要です)

結果を確認する

提出ボタンを押すと「③ステータスビュー」と「④テストケースビュー」が以下のように更新されていきます。

ステータスビュー右上(③-1)にジャッジの進捗状況と結果が表示されます。ジャッジの進捗は「WAITING JUDGE(待ち)」→「JUDGING(判定中)」→「結果」と移り変わります。上図の最初の例では、試しに文法にミスがあるコードを提出したので結果が「COMPILE ERROR(コンパイルエラー)」となっています。

コンパイルエラーの場合は、ステータスビュー下部のメッセージでエラーを確認することができます。

ステータスビュー中央(③-2)の直線上のチェックマークはジャッジのステージを表し、ステージのどこまで成功したかを確認するための補助的なビューです。ステージは左から右へSubmitted → 進捗が「WAITING JUDGE」に変化 → Sent to Judge → 進捗が「JUDGING」に変化、と遷移していき、以降のステージも左から右に順番にチェックされ、失敗したところで結果が決定するか(不正解)、あるいはすべてのステージをパスし結果が「ACCEPTED(正解)」となります。

コンパイルエラーを修正して、再度提出してみましょう。今度は、以下のような結果が表示されました。

今回は、間違ったコードを提出したので結果が「WRONG ANSWER」となりました。前回のCOMPILE ERROR から少し進歩し、Build、Run、Resource Limit Check をクリアしています。コンパイルと実行が成功している場合は、ステータスビュー下部(③-3)で、ジャッジ結果に加えてプログラムが使用したCPU時間とメモリを確認することができます。CPU使用時間とメモリ使用量はそれぞれ、提出プログラムが問題のジャッジデータに対する結果を出力するために要した1/100秒単位の時間とキロバイト単位のメモリ使用量です。複数のテストケースがある場合は、テストケースにおける結果の中で最大の値がそれぞれ表示されます。

ジャッジの状態と判定結果をさらに詳しく確認します。 ジャッジは以下の手順で進行し判定を行います:


ステージ 進捗/結果 詳細
Submitted WAITING JUDGE サーバ側のAPIにプログラムが届き、キューに追加されました。順番待ちの状態です。
Send to Judge JUDGING プログラムがキューから取り出され、ジャッジに送信されました。判定結果を待っている状態です。
Build CE: COMPILE
ERROR
提出されたプログラムのコンパイルに失敗しました。コンパイルエラーメッセージを確認してください。
Run RE: RUNTIME
ERROR
提出されたプログラムの実行中にエラーが発生しました。不正なメモリアクセス等による Segmentation Fault、スタックオーバーフロー、ゼロによる割り算など多くの原因が考えられます。
Resource
Limit Check
TLE: TIME LIMIT
EXCEEDED
問題に指定された制限時間内にプログラムが終了しませんでした。各テストケースについて、ジャッジは問題の制限時間の2倍程度の間プログラムを実行し続けます。ただし、20秒を超えた場合は強制終了されます。
MLE: MEMORY
LIMIT EXCEEDED
提出されたプログラムは、問題に指定された以上のメモリを使用しました。
OLE: OUTPUT
LIMIT EXCEEDED
提出されたプログラムは、制限を越えたサイズの出力を行いました。
Result Check WA: WRONG
ANSWER
提出されたプログラムは審判データと異なる出力データを生成しました。特別なジャッジについては、問題専用に準備された検証器の結果や精度を考慮します。
Presentation
Check
PE:
PRESENTATION
ERROR
提出されたプログラムは、ほぼ受理される出力を行っていますが、出力形式に誤りがあります。余計な空白や改行を行っていたり、あるいは必要な空白や改行を出力していません。
  AC: ACCEPTED 提出されたプログラムは上記すべての審査において拒否されなかったため、"受理"されました。

ジャッジ結果の詳細を確認するために、④テストケース(TEST CASE)ビューを見てみましょう。 オンラインジャッジでは、複数のジャッジデータファイル(テストケース)を用いて正誤・性能判定が行われます。テストケースビューでは、各テストケースごとの判定結果と使用したリソースを確認することができます。AOJでは、あるテストケースについて不正解だった場合、それ以降のジャッジを中断し即座に結果を返します。  

今回の例では、最初の2つのテストケースに対してはACしていますが、3つ目のテストケースでWRONG ANSWER となっています。テストケースビューでは、各ケースの左端のアイコンをクリックすることで、ジャッジデータとして利用されたテストケースの内容を確認することができます。例では、WRONG ANSWERになった3つ目のテストケースを展開しています。左側にinput、右側にoutput(正しい出力)が表示されます。ジャッジデータはデバッグの参考にもなりますので、必要に応じて活用しましょう。

オンラインジャッジでは、ジャッジ結果にかかわらず何度でも再提出を行うことができます。正解するまで、あるいは納得のいくコードや性能が得られるまで、何度でもチャレンジしましょう。

バグを修正して、再度プログラムを提出してみます。以下のようにすべてのステージにチェックが付き、結果がACCEPTEDになれば正解です。

ジャッジキューを閲覧する

一般的なオンランジャッジシステムでは、他のユーザの提出履歴を閲覧することができます。AOJではジャッジキューの状態をオープンにするため、最近の提出状況やユーザの提出履歴を公開しています。 メニューの「最近の判定結果」から、以下のようにユーザの最近の提出状況を確認することができます。

問題を解き終わったら・・・

オンラインジャッジでは、問題を解き終わった後、または問題につまづいてしまったときなど、学習の参考になる情報を公開しています。問題ページの下部の⑤フッタには、当該問題に関連する以下の情報へのリンクがまとめられています。

  • Web Board (掲示板): 問題に関する議論やアナウンスが行われている掲示板へ移動します。
  • Solutions (解答例): 解答例のページへ移動します。問題に正解した他のユーザのソースコードを閲覧することができます。
  • Statistics (統計): 問題に対する統計情報ページへ移動します。言語ごとの正解数やステータスの各種統計情報を閲覧することができます。
  • Tagging (タグ): 問題に関連付けられたタグ・カテゴリリストのページへ移動します。カテゴリとタグを閲覧・追加することができます。

これらのいくつかの機能については次回詳しく紹介します。

今回は問題の閲覧とプログラムの提出方法について解説させて頂きました。提出方法や結果の見せ方など、ユーザインタフェースはまだまだ改善の余地があると思います。引き続きユーザの皆さまからのご意見・ご要望をお待ちしております。

ここまでの回で、オンラインジャッジシステムの使い方や基本機能を解説させて頂きました。次回は、オンラインジャッジを用いた学習をサポートする補助的な情報や機能についてご紹介します。

著者プロフィール

渡部有隆(著者)
(わたのべ ゆたか)1979年生まれ。コンピュータ理工学博士。会津大学コンピュータ理工学部情報システム学部門 上級准教授。専門はビジュアルプログラミング言語。AIZU ONLINE JUDGE 開発者。
http://web-ext.u-aizu.ac.jp/~yutaka/