Tsuzu's Notes

主にIT系備忘録

2015年を振り返る

今年したあれこれを振り返ってみます。
なんかAdC記事と被りまくってますね、書いちゃったからいいや。

JOI2015本選

 そういえば今年だったな、というレベルで忘れてました。
予選参加は3回目でしたが10007割り忘れとかで落ちてたので本選に参加したのは本選に参加したのはこの時が初めてです。ちなみに結果はとても酷いものでした...笑えないほどに...。もっとやっておくべきだった、というありきたりな一言に尽きます。
 しかし大会等の本選に参加したのは初めてで良い経験になり食事も交通費も宿泊費も出るという待遇の良さに驚きました。
 来年の本選も400点とかいう低すぎる点数ではありますがなんとか出ることができたので今年より良い結果を出せるように頑張りたいです。そして会場が筑波ですし、楽しみです。

SuperCon 2015本選

 (何度も言ってますが、予選はC++使わせてくれ!!)
 この時の予選は、6月とかの学校真っ最中で2週間ほどの予選期間があり友人と2人でひたすらアルゴリズム考えてました。結局一部のケースでは通らない可能性がある、という不完全なコードで提出しました。最初C++で書いていたコードをC言語に書き換えたのでqueue構造を自力実装したり等面倒くさいことをする羽目になりました。とか言いつつほとんど友人氏がやってくれたんで全く活躍してないんですがね。
 さて本選ですが、東工大スパコンとかある建物が会場でした。コーディングをするためのPCは1人1台使えます。スパコン自体は大阪大のものをSSH接続して使いました。正確にはスパコンのフロントエンドサーバ*1ですが。(余談ですがスパコンってNEC製のC/C++コンパイラ使うんですね、驚きました!)
 また、SuperConの特徴としては制限が緩いことですね。もちろん期間中のインターネットでの検索等は禁止されてはいましたが、会場に来る時間、帰る時間とかは割とフリーで参加者間でのコミュニケーションも認められていました。そして、PCに触れたり問題を考えるのではなく参加者間で話をしたり休んだりする強制休憩タイムなるものもありました。この時間はテレビ通話で東京会場と大阪会場が結ばれ、割と盛んに会話が行われていました。(Twitter IDを書いた紙を見せる、学校とゾンビのアレなど...※SuperCon本選は8月)
 そろそろ競技に関する話をします。大阪大学スパコンはCPU + ベクトル計算機という構成で成り立っています。ベクトル計算機複数の同じような処理を同時に行う能力に長けています。本来CPUで行われる処理をベクトル計算機に投げる処理をベクトル化と言います。例としてベクトル化が行われるコードを挙げます。

int arr[100];
for(int i = 0; i < 100; ++i)
  arr[i] = i;

このようなコードは独立した作業を100回行うため、ベクトル化が可能です。ベクトル化が効かないのはDPなど前の演算結果が次の演算に影響を及ぼすコードです。(コンパイラが優秀なため、一部の漸化式はベクトル化がされるそうですが。)
 課題はセルオートマトンをシミュレーションし、与えられた条件と合致する部分を探す、というものでした。アルゴリズムよりもいかにベクトル化して高速化できるかが鍵となりました。私と友人はベクトル化よりもアルゴリズムの改善をしようとしていたため高速化ができず良い結果を出せませんでした...。とても悔しいです。
 来年も参加したいですが毎年使ってるスパコンが違うみたいですのでベクトル計算機ではない可能性が高いですね。 あとPCKは予選落ちしました。

ゲーム制作

 日頃Macを使っているせいかゲーム制作にはほぼ縁がありませんでした。今年作ったので多分2個目とかです。
 文化祭のために作る必要がなければ作ってなかったと思います。ゲーム制作を通じて、感じたことを挙げていきたいと思います。(制作したゲーム本体に関することはSiv3D AdCの記事を御覧ください。)

  • オブジェクト指向って素晴らしい!
    いつもどっちかというと競技よりの活動をしている身としてはオブジェクト指向を使って大きなプロジェクト作ったりすることはなかったのですが、いざゲーム制作をしてみるとオブジェクト指向の便利さに驚かされました。機能ごとにクラスをまとめておいて関数を呼ぶという方式がとても便利ですね。まあ逆に言えばオブジェクト指向という枠に囚われることで範囲が狭まり設計がしやすかったんだと思います。どっちにしてもゲーム制作においてオブジェクト指向はもはや必須とも言えるのではないでしょうか。
  • C++11 or laterの数多くの機能を使えない苦痛
    このゲーム制作では物理演算、通信などの補助機能的なクラス、ライブラリを先に実装し、その後ゲーム本体の製作をしました。汎用的なクラスや関数を実装しようとした時、C++11や14の機能が欲しくなりましたが使用しているライブラリの都合上Visual Studio 2013で開発していました。(これがなかなか曲者で中でもA(A&&) = default;が書けないのが一番辛かった...。)
    C++11の機能を使いたい、あわよくば14。C++03なんて使いたくない、以上です。MSさんには是非とも早急なC++14の機能の実装、もしくはclangの対応等を要求します。
  • 数学ができないとゲーム制作って大変
    今回は3Dのゲーム製作だったのも大きいですが、Quaternion(四元数)がチンプンカンプンでした。
    OBに質問しながらなんとか作ることができましたが、綺麗な実装のためにも数学力は必要不可欠だと痛感しました。プレイヤーやオブジェクトを扱うのはベクトルや行列を使うのがとても便利ですし、競技プログラミングでも求められるので数学とプログラミングは切っても切れない関係のようです...。数学、頑張ろう。

あと、ゲーム制作の話ではないのですが、文化祭で出し物をするときはちゃんと計画を建て、適切な仕事配分をして、やるべきことをリストアップするのが必須ですね。(戒め)

まとめ

こんぐらいですかね...ほぼAdCと丸かぶりした内容だったりするのですが...。
今年ももう終わるのか...早すぎる。今年は高校生になった年でもあり、割と重要な年だったように思います、忙しかったですし。最近時が経つのが早すぎてこのペースだとあっという間に寿命を迎えて死んでしまうのではないかと思うレベルです。
来年の今頃はもう受験を念頭に置かなければいけない時期だと考えると驚きます。ではみなさん良いお年を!

あ、JOI本選とか競プロ本選とか参加される方はLinuxの「ターミナルでの操作」に慣れておいたほうがいいですよ!慣れてないと本当大変だと思われるので。では。

*1:スパコンに演算のリクエストを送るための中継地点。ここにSSH接続してコードをクロスコンパイルしたり演算リクエストをする。