マナティ

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

第4回 オンラインジャッジシステムの機能を活用しよう

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

プログラミングは知的で難しい作業です。そのため、プログラミングの自主学習では、つまづいてしまうポイントも多くあり、時には苦しむこともあると思います。このようなときは、オンラインジャッジの情報資源をうまく活用して、問題を解決しましょう。

これまでの連載では、オンラインジャッジシステムの概念やAOJの基本的な使い方について解説させて頂きました。最終回となる今回は、プログラミングの学習を効率的に、楽しく進めるための補助機能をいくつかご紹介します。モチベーションを維持しながら、継続的に問題を解いていきましょう。

問題の解説を参考にしよう

初心者の方が新しくプログラミング言語を学ぶときは、問題文を読む前に、文法などの前提知識が必要になる場合があります。コードが書けたとしても、間違いの原因が分からず、デバッグで学習が滞ってしまう場合も多くあります。

基本文法を一通り身に付けた中級者の方でも、問題の読解はできても、コードを書く前に、アルゴリズムの知識や発想が必要な場合があります(※プログラミングコンテストでは、発想・思考力がより重要になります)。また、コーディングが終了して正しい出力が得られても、より効率の良い解を求められる場合もあります。

このように、オンラインジャッジを用いたプログラミング学習では、学習の手助けのタイミングや内容が、学習者のレベルや問題設定によって変わってきます。

AOJでは、各問題のページから、必要に応じて、ノート(解説)を開くことができます(解説がついている場合)。ノートは、問題文の前と後ろにその入り口が表示され、それぞれ問題文を読む前に役立つノート、問題文を読んだ後または問題を解いた後に役立つノートが開きます。

また、ノートは「言語解説」と「一般解説」のように分類され、言語解説では、選択したプログラミング言語の文法解説や模範解答を閲覧することができます。一般解説では、アルゴリズム、ヒント、関連リンクなど、プログラミング言語に依存しない解説や情報を閲覧することができます。

これらのノートの内容は、分類・対象を選択することで、必要なときに必要な内容を展開・表示することができます。例えば、以下の問題では、問題文の前にノートへの入り口が表示されています。

例えば、C++言語を選択して言語解説ボタンをクリックすると、以下のようにC++言語の前提知識に関する解説が展開します。

※現在、解説がサポートされている問題が限られますが、可能なものから追加・更新していく予定です。

公開されている解答ソースコードを参考にしよう

プログラマにとって、他の人が書いたコードを読解できる能力は重要です。学習においては、正しく動くコードは参考資料として有効活用することができます。初級者でプログラミング言語を習得する場合は、文法の確認に役立ちます。中級者・上級者の方でも、より優れた書き方を学ぶことができますし、より経験のあるプログラマが書いた洗練されたコードを参考にすることで、レベルアップを図ることができます。

AOJでは、ユーザ設定により、自分が提出したソースコードを公開することで、他のユーザの学習に貢献することができます。学習者の立場としては、公開されている他のユーザのコードを自由に閲覧することで、他のユーザから学ぶことができるのです。

ユーザのソースコードへは、主に以下のページからアクセスすることができます:

  • 各問題のSolutionsページ
  • 提出履歴のジャッジIDリンク

問題文ページ下部フッタのSolutionsリンクから、以下のような、各問題のソリューションページを開きます。

ページの上部 には、プログラミング言語ごとのソリューションの数がチャートで表され、チャートのバー、またはチャート左下のボックス からプログラミング言語を選択することで、特定言語のソリューション一覧を表示することができます。最初に開いたときは、ユーザ登録で設定されている、普段利用しているプログラミング言語のソリューションリストが表示されます。

表示エリア には、ソリューションの一覧が表示され、右上のメニュー から、表示順の基準を設定することができます。デフォルトでは、ユーザのレーティング順で表示されます。レーティングについては次の章で解説しますが、より経験値が高いプログラマのコードがより上位に表示されると考えてください。また、提出日時順、CPU・メモリ・コード長などの性能順でソートを行うこともできます。

各ソリューションはカードで表され、ソースコードの作者(ユーザID)に加えて、CPU時間やメモリ使用量などの概要を確認することができます。

カードを選択すると、以下のように、ソースコードが表示されます。

ユーザステータス

プログラミングを習得する上で必要なこととして、反復演習、習慣化、モチベーションの維持があげられます。そのために有効な活動の1つが、定期的にプログラミングコンテストに参加することです。

オンラインジャッジでは、自由なタイミングで好きな問題を解くことができますが、正解数などで競い合えば、時間制限のない長期的な競争ととらえることもできます。そこで、一般的なオンラインジャッジシステムでは、ユーザの活動や成績を数値化して公開することで、反復演習と習慣化を促しています。問題を解決することが一番の楽しみではありますが、進捗や能力をチャートやランキングで確認することも、モチベーションの維持に繋がると思います。

第2回の記事で解説させていただいたように、AOJでは、コースとチャレンジそれぞれについて、全体あるいはトピック・セクションの達成度を確認することができます。さらに、チャレンジについては、以下のユーザステータスページに表示されるように、基本情報として、問題数、レーティングなどが更新され可視化されます。

最初のチャートSolved Problems, Daily Effort は、日ごとの正解した問題数とその累計を表すチャートです。累計は減ることがありませんので、継続的に問題を解いていれば、右肩上がりのチャートになります。

次のチャートWeekly Rating は、一週間ごとのレーティングの推移を表します。ここでは、レーティングは、各問題に割り当てられたスコアの合計と考えてください(※プログラミングコンテストで得られるレーティングの概念とは異なります)。AOJでは、基本的に、解いた人数が少ない問題ほどスコアがより高く設定されています。問題のスコアが日々変動するため、レーティングも上下に変動します。問題を解かない日が続けば、レーティングは下がっていきますが、より難しい問題を解くとより上位に変動します。レーティングは毎週土曜日の深夜に自動更新されます。

最後のレーダーチャートRating By Problem Classification 、Rating By Algorithm Classification はそれぞれ、問題の分類によるスキル、解法(アルゴリズムとデータ構造)の分類によるスキルを可視化します。これらのレーダーチャートからは、おおよその得意・不得意分野を把握することができます。第2回の記事でご紹介した、検索システム→カテゴリ検索と組み合わせて、弱点を補ったり、得意分野を伸ばす、といった目的で活用することができます。各スキルのスコアの計算には、ユーザによって付けられたカテゴリタグが用いられています。

※スコアやレーティングの計算アルゴリズムは、今後変更される可能性がありますのでご了承ください。

ランキング

オンラインジャッジは、プログラミング言語やアルゴリズムを学びたい、プログラミングコンテストの対策をしたい、問題解決やコーディングを楽しみたいなど、様々な目的に応じて利用することができます。

個人の目的にもよりますが、競争やランキングを意識することは、問題を解くモチベーションを上げるきっかけになります。一般的なオンラインジャッジシステムでは、解いた問題数などでユーザのランキングを行っています。AOJでは、ランキング(メニュー→ランキング https://onlinejudge.u-aizu.ac.jp/#/ranking/rating) にてユーザのランキングを公開しており、主に以下のカテゴリでランク付けを行っています。

Solved (問題数) : オンラインジャッジシステムの伝統的なランキングです。「チャレンジ問題」で正解した問題数でランク付けされます。アルゴリズムを重視したランキングですので、複数言語で1つの問題に正解した場合でも1問(1点)と数えられます。簡単な問題も難しい問題も1点ですので、多くの問題解決を楽しみたい方にお勧めのランキングです。

Rating (レーティング) : レーティング = 正解したチャレンジ問題のスコアの合計でランク付けされます(Solved同様言語の重複は考慮しません)。より難しい問題を解くことで、少ない問題数でも上位に昇ることができます。プログラミングコンテストの対策をしたい方にお勧めのランキングです。

Leaderboards - Languages (プログラミング言語) : プログラミング言語ごとに、「チャレンジ問題」と「コース問題」両方について、正解した問題数でランク付けされます。特定のプログラミング言語で問題をたくさん解きたい方にお勧めのランキングです。

Learderboards - Contests (コンテストのソース) : コンテストのソースごとに、「チャレンジ問題」について、正解した問題数でランク付けされます。Solvedをコンテスト(ソース)ごとに分けたランキングとなります。特定のプログラミングコンテストの対策をしたい方にお勧めのランキングです。

例えば、Rating, Learderboards - Languagesはそれぞれ以下のように表示されます。

おわりに

本連載では、オンラインジャッジシステムや新しくなったAizu Online Judge(AOJ)の機能についてご紹介させていただきました。

今回ご紹介しきれなかったページや機能もありますが、基本的な使い方や主要機能についてはご確認いただけたと思います。また、開発途上の機能も多々あり、改修を進めておりますので、皆さまからのご意見・ご要望をお待ちしております。皆さまが、プログラミングとアルゴリズムによる問題解決を楽しめるよう、引き続き開発・運用してまいります。是非、プログラミングコンテストにもチャレンジしてみてください。

著者プロフィール

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