マナティ

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

第1回 オンラインジャッジシステムを知ろう

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

はじめに

プログラミングはコンピュータに処理を指示する知的な活動であり、現代の社会と科学の発展には欠かせない技術となっています。また「プログラミング的思考」はあらゆる分野で普遍的に求められる資質として、教育面でも注目されています。

プログラミングのはじめ方は様々です。ロボット制御やアプリ開発などからは動く面白さや達成感が得られるでしょうし、書籍からは文法、ライブラリ、フレームワークなど多くの知識を体系的に学ぶことができます。しかし、これらの体験や勉強からだけでは、プログラマにとって本当に必要な資質・能力をすべて養うこと、またその本質を知ることは難しいと言えます。

この資質・能力の1つが、仕様を理解し、要求に応じた十分効率の良いコードを、"正しく" 記述できる能力です。安全性と信頼性を保障した上で、計算効率を追求し、より優れたアルゴリズムを組み立てる論理的思考力が不可欠なのです。実装をよりシンプルにするための発想も必要です。

プログラムは正しく書くことが大前提です。しかし、書いたプログラムにはバグ(プログラムの誤り)が埋め込まれてしまいます。バグが利用者、開発者、そして学習者を苦しめます。見過ごされ放置されたバグは大きな損失と浪費を生むだけでなく、学習者の間違った理解につながります。ソフトウェアの動作を遅くする効率の悪いコードも同様です。書いたコードが正しくかつ効率良く動くかを確認するためには厳格なテストデータが必要になります。ソフトウェア開発では、テスト工程で入念にその品質が検証されます。しかし、入力ケースを網羅する膨大なテストデータの作成は、自主学習や教育においては大きな手間となってしまいます。

そこで、プログラミング力を養う教育ツールの1つとして、オンラインジャッジをお勧めします。オンラインジャッジとは、多くの演習問題にチャレンジすることができ、オンラインでコードを採点してくれるサービスです。各問題には、テストデータが準備されており、提出されたコードの正誤とその効率の判定を即座に行ってくれます。オンラインジャッジを通して、利用者は以下のことを繰り返し追求することで、プログラマに必要な資質・能力と知識を体得していきます。

  • 文書から要件を正確に理解する。
  • 計算効率・メモリ使用量を的確に見積もり、コンピュータの資源を考慮したアルゴリズムを設計する。
  • 設計通りのアルゴリズム、あるいは頭の中で描いた手順を、バグのないプログラムとして実装する。
  • プログラマに必要な、データ構造とアルゴリズムの幅広い知識を獲得する。

さらに、オンラインジャッジを使ったプログラミングの魅力は、ゲーム感覚で楽しく学習が進められることです。読解、問題解決、コーディング、正解判定の反復を通して、知識・技術を継続的に体得することができます。

最近では国内外で様々なオンラインジャッジシステムが運用されています。北京大学のPOJ(http://poj.org/)やValladolid 大学のUVa(https://uva.onlinejudge.org/)が歴史のあるオンラインジャッジシステムです。オンラインジャッジシステムはプログラミングコンテストやその練習場として活用されてきました。国内でも活発にプログラミングコンテストが開催されており、多くの人が参加しています。初心者から上級者まで楽しむことができますので是非チャレンジしてみてください。競技プログラミングについてはAtCoderではじめる競技プログラミング(https://book.mynavi.jp/manatee/series/detail/id=56240)にてとても分かりやすく紹介されています。

この連載では、国内のオンラインジャッジシステムの1つである、Aizu Online Judge について、いくつかの回に分けてご紹介します。

オンラインジャッジとは?

一般的に、オンラインジャッジシステムは下図のようなしくみになっています。

concept2018.png

オンラインジャッジシステムには、レベルや分野の異なるたくさんの問題が収録されており、様々なユーザがチャレンジしています。ユーザは問題リストから問題を検索・選択し、問題を閲覧します。問題には、主に問題文、入出力例、CPU使用時間等の制限事項が書かれています。問題を読解した後に、問題解決とコーディングにチャレンジします。

オンラインジャッジはユーザから提出されたプログラムをコンパイル・実行し、問題ごとに準備された厳格なジャッジデータ(テストデータ)や検証プログラムを用いて、コードの正しさと効率を判定(ジャッジ)します。具体的には、

  • プログラムが正しくコンパイルされるか(エラーの場合はメッセージを返します)
  • プログラムが正常に終了するか
  • プログラムが指定された制限(CPU時間、メモリ使用量)内で停止するか
  • プログラムがジャッジデータに対して正しい出力を行っているか

を自動で判定し、即座に結果をフィードバックしてくれます(※その他にも、競技形式等によって様々なジャッジ形態があります)。

一般的に、オンラインジャッジシステムは様々なプログラミング言語に対応し、24時間インターネットからアクセスして自由に自分のペースで問題を解くことができます。また、各問題には、納得できるまで何度でもプログラムを提出しチャレンジすることができます。

このように、オンラインジャッジシステムは、プログラミング初心者の学生からエンジニアまで、プログラマとしての能力を養いたい方が自主学習ツールとして活用することができます。入門レベルの問題も多く含まれるため、プログラミングコンテストに特化しているわけではなく、プログラミング、アルゴリズムとデータ構造など、学校の授業の教育ツールとしても活用できます。

Aizu Online Judge の紹介

それでは、さっそく次のURLからAizu Online Judge(AOJ)のページにアクセスしてみましょう。

https://onlinejudge.u-aizu.ac.jp/

※2018年1月1日よりユーザインタフェースが新しくなりました。今後の修正やアップデートで構成が変わる可能性がありますのでご了承ください。
※前バージョンのインタフェース(http://judge.u-aizu.ac.jp)からも引き続きご利用いただけます。

今回はページの構成やメニューの概要を確認し、次回以降の記事で、ユーザ登録、問題閲覧、コード提出の方法について詳しく説明していきます。

AOJ のヘッダは次のような構成になっています。

header.png

まずは、ページ右上の国旗のアイコンをクリックして、サイトの表示言語を指定します。日本語または英語を選択することができます。

問題文や公開ソースコードなどのコンテンツは、ゲストユーザとして自由に閲覧することができますが、プログラムを提出するためには、ユーザ登録を行う必要があります。Guestのメニューから、新規ユーザ登録、サインイン、マイステータスなどのページに移動することができます。ユーザ登録の方法は次回の記事で詳しく説明します。

AOJは主に、コース、チャレンジ、アリーナの3つの項目から構成されています。これらは

  • コースでプログラミングの基礎力をつける
  • コンテストなどの過去問に挑戦する
  • コンテスト形式や演習形式で問題セットにチャレンジする

という目的ごとに、それぞれ特化した検索機能やユーザインタフェースを提供するものです。これらの詳細は次回以降の記事で詳しくご紹介します。

ヘッダの左端のアイコンから次のようなメニューを開くことができます。

menu.png

メニューは[User Activity]、[User’s Guide]、[Information]、[Other]の4つのセクションから構成されています。セクション内の各項目は、対応するページのリンクになっています。いくつかの項目については、今後の記事で詳しく説明します。

[User Activitiy]は日々更新されるユーザの活動状況や統計情報を提供します。AOJでは、正解した問題数など様々な基準でユーザがランキングされます。他のユーザと競争することでモチベーションを維持することも1つの学習方法です。また、ユーザの最近の提出状況などをリアルタイムで観察することができます。

[User’s Guild]には、主にはじめてAOJを利用される方向けの情報がまとめられています。例えば、ジャッジの判定結果の意味や、統計情報の内容などを確認することができます。

[Information]、[Other]には、システムやコンパイラの詳細、内部情報、開発者向けのAPIなど、より興味に特化した詳細情報が提供されています。

今回はオンラインジャッジシステムのしくみと、Aizu Online Judgeの概要をご紹介しました。次回は、AOJへのユーザ登録と問題検索・閲覧について詳しくご紹介します。

著者プロフィール

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