AtCoder を始めようかと思っている学生たちへ

現在、全国的に情報系の学生たちの間では空前の AtCoder ブームとなっていて、
「AtCoder を始めた知り合いが増えてきて、就職活動にも活用できそうだし、この機会に自分も始めてみたいけどどうしようかな」と考えている学生も増えてきているのではないでしょうか?
結論を先に言うと「なるべく早いうちから参加しましょう」となりますが、これまでに何回かコンテストに出場してみた経験からいろいろ書いていこうと思います。

AtCoder は、競技プログラミングのコンテストを Web で実施しているサービスです。
以前は競技プログラミングといえば難解でマイナーなイメージでしたが、AtCoder では難度の低い問題から段階的に用意されており、ページも見やすくカジュアルに参加できるようになっています。
初心者向けである AtCoder Beginner Contest はほぼ毎週、土曜日または日曜日の夜にオンラインで実施されています。

AtCoder の参加者のうち7割を学生が占めています。
とくにここ1年くらいの参加者の伸びが大きく、最近の AtCoder Beginner Contest では約5000人が参加しています。
しかしこのブームに乗って就職活動に役立てようと思いつつも、「実力を上げてから参加したい」と考えている人もいるのではないでしょうか?

これに対しては「なるべく早いうちから参加しましょう」が答えです。
なぜなら、コンテストへの参加回数が少ないと、実力がレートに反映されないからです。
最低でも14回以上は参加しておかないと実力よりも低いレートになる仕組みで (リセットマラソンの効果が低い)、実力証明が欲しいと思ったときに急に参加しても実力が認定されるわけではありません。

また、AtCoder におけるレートやランク (色) のレベル感を認識しておく必要があります。こちらの記事に説明が載っています。

AtCoder には日本全国・世界の強者が集まっており、水色 (1200) 以上あれば実務上カンストの上級者だろうと考えています。実社会では緑色の人に遭遇するのもなかなか難しいでしょう。
通常の学生であれば、茶色が認定されれば十分実力があると言えます。

初級者はまず AtCoder Beginner Contest に参加して、問題 A・B を解くことを目標にしましょう。
問題 C までは分岐、ループ、データ集計など、一般的な開発者が実務で書く程度のコードでクリアできます。
問題 D 以降は処理高速化のためのアルゴリズムの知識・経験が必要になってきます。
もし仕事でプログラミングをしているのであれば、問題 C までは正解しておきたいところです。

本番のコンテストに参加する前に、過去問を練習しておきましょう。
問題文や解答の体裁に慣れていないと本番で無駄な時間を使ってしまいます (標準入出力など)。
コンテスト中もコンテスト外のときもサイトの使い方はまったく同じなので、過去問で本番同様の練習ができます。
過去のコンテストの問題は全て公開されています。他の参加者のコードを読んで参考にするのもよいでしょう。
AtCoder Problems という有志のサイトもおすすめです。

プログラミング言語は好きなものを選んでください。
標準入出力などのよく使うコードを含めたテンプレートを用意しておくとよいでしょう。例えば C# ではこんな感じです。
https://gist.github.com/sakapon/a88697da54fc78f838baeadcc19b54c4

各問題にはテストケースが用意されていて、それらをすべてパスすれば正解 (Accepted) となります。
こんな感じで、エディターからコピー&ペーストで提出できます。

AtCoder-Sub

というわけでまずは2~3か月、毎週参加し続けるのです(沼

追記 (11/26):出場11回目で水色に到達しました。
ABC146-Rating

comments

習作のすすめ

「習作」というのは、主に芸術の分野で使われている言葉で、練習のために小作品を作ることを指します。
プログラミングにおいても習作はいいぞ、という話をします。

学生の皆さんは普段、授業などで身に付けた技術を応用して何かを制作しているでしょうか?
あるいは逆に、何かを実現するために技術を応用しているでしょうか?
創作の経験の少ない人が何か壮大なものを作りたいと思い浮かべたとしても、すぐに実現するのは難しいことだと思います。
技術の習得とその応用には乖離があるのです。技術力と創造性のマッチングが必要で、いずれかが不足していても達成できません。

そこで、普段からそのギャップを埋めるための練習をしておくことが求められます。
ブログのネタを例に考えればわかりやすいと思います。
最近習得した技術についてブログの記事を何か書くことになったとして、他の人が作ったチュートリアルを手順通りに実施してそれについて書く・・・というのでは物足りないですよね。
例えば、自分なりの視点でどういう場合に役に立ちそうかを考えながら技術検証し、自分の興味の延長にあるサンプルを作るという方法が考えられます。これが習作です。
いろいろな人のブログ記事を見れば、このタイプがかなりあることに気づくでしょう。ブログのネタとしてなんとなく「ちょうどええ」範囲があると思います。

習作の結果として前例に重複することもあるとは思いますが、それはかまいません。
自分で考え出したものを自分で解決して作ってみることが成長につながります。
初めて使う技術の検証と軽い創作を同時に実施するという点で一石二鳥であると考えています。

一見それほどでもないアイデアのものでも、実装してみると知らなかった機能に出会えたり、あるいは、考えていたことが実現不可能であることがわかったりします。
その結果から技術を深掘りしていくこともあれば、アイデアを別の作品に昇華させていくこともできるでしょう。
習作では、技術力と創造性の向上の両面があることがポイントです。
技術検証や創作の練習を通して、今後の引き出しを増やし、何ができるかわかるようになります。

英語の表現を新しく覚えたら自分が日常生活で使いそうな文にアレンジしてみたり、
微積分を覚えたら乗り物の速度・加速度や目的地までの距離を概算してみたり、
身に付けたことを普段から社会に応用しているか、そのための視点を持っているかが大切になるのです。

参照

comments

Java10がリリースされました

未来環境ラボの中口です。

遂にJava10がリリースされました。前バージョンのJava9から半年でリリースされことになり,Java8からJava9までに3年半かかったことを考えると大幅なスピードアップです。これはJavaを提供しているOracleが,新機能をどんどん取り入れてJavaを進化させるよう方向転換したためで,今後半年毎に新しいバージョンがリリースされる予定です(関連記事)。

さて,Java10ではいくつか新機能が導入されていますが,目玉はやはり,ローカル変数の型推論,”var”でしょう。JavaはJavaScriptやPythonと違って,変数の型を強く意識する必要がある,静的型付け言語です。静的型付け言語では,ソースを記述する際に,変数の型を決めておく必要があり,一旦型を決めると,後で変更できません(例えばint型の変数にString型のオブジェクトを入れることはできません)。そのため変数を使うたびに型を明示的に記述する必要があり,どうしても記述が冗長になってしまいます。コード例を見てみましょう。

List<String> strings = new ArrayList<String>();

Javaを書いたことがある人なら一度はこんなコードを書いたことがあると思いますが,変数の宣言時(“=”の左側)で変数の型(List<String>)を指定し,変数に代入するオブジェクトの生成時(“=”の右側)でも型(ArrayList<String>)を記述しています。varでは,この左側の型を省略できます。

var strings = new ArrayList<String>();

もちろんメソッドの戻り値を代入する際にも利用できます。

var r = Math.random() * 10;

ただしJavaは静的型付け言語であるという特徴は変わっておらず,スクリプト言語のように後から型を決めたり変えたりということができるようになったわけではありません。例えば次のコードはコンパイルエラーになります。

var i;
i = 10;

varを使うと変数の型を省略できますが,同時に変数の初期化を行う必要があり,その初期化で実際の型がわかる必要があります。例えば,次のコードはコンパイルできますが,

Runnable r = () -> {};

varを使うとコンパイルエラーになります。

var r = () -> {};  // コンパイルエラー!!

右側はラムダ式ですが,ラムダ式は実際のクラスを代入先の変数の型などで決めるので,varを使うと変数もラムダ式も型を決めようとしてお互いの情報に頼ってしまうので決まりません。逆に実際の型さえわかればその型として使えるので,今まで明示的に指定できなかった匿名クラスを扱うことができ,そのメソッドを呼び出せます(関連記事)。

var o = new Object(){
   public void func(){
  }
}
o.func();

個人的にはこれが一番嬉しいんですが,結構特殊なケースなのでピンとこない人も多いかもしれません。

Javaは今後半年ごとに新機能が追加され,どんどん進化していきます。他の言語も良いものがたくさんありますが,今一度Javaを見直してみてはいかがでしょう?

comments