【#HTTF】競プロのビジュアライザーを作った話（本選）

2018年3月3日にHack To The Future (#HTTF)というマラソン形式の競技プログラミングコンテストの本選が開かれました。
参加していただいた皆さんありがとうございます。

今回、この#HTTF向けにビジュアライザーをつくりました。

あれ、なんか既視感あるぞ、と思った方はおそらく[予選のビジュアライザー記事](https://qiita.com/alfe_below/items/cd44fb14749ac58d7572)を見ていただいた方。ありがとうございます。

# 問題文

今回の問題は、マップ上に育つ植物ツカモの栽培・採集をいかに効率よくできるか。
ツカモを植えたり、道路つくったり、障害物の岩を壊したり、アルバイトをしたり。
より詳しくは[本選ページ (https://future-contest-2018-final.contest.atcoder.jp/tasks/future_contest_2018_final_a)](https://future-contest-2018-final.contest.atcoder.jp/tasks/future_contest_2018_final_a) を確認いただくとして、このお題を貰ったときに牧場物語というゲームを連想しました。

せっかくだし、ゲーム画面っぽいビジュアライザー作りましょうか。

# ビジュアライザー
できました。

Twitterに動作している様子を動画で上げてくださってる方がいるので、そちらのツイートでご覧ください。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a> の本戦中の最終コードのexample_03のビジュアライザー（example_01は見られたので03にしてみた） <a href="https://t.co/2oYCkjSnHt">pic.twitter.com/2oYCkjSnHt</a></p>&mdash; laycrs (@laycrs) <a href="https://twitter.com/laycrs/status/970264189951385605?ref_src=twsrc%5Etfw">2018年3月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a> おつかれさまでした。31,781,228点で、オープン3位。出力はこんな感じでした(example_03.txt) <a href="https://t.co/SkL3YBDRjK">pic.twitter.com/SkL3YBDRjK</a></p>&mdash; yowa (@yowa) <a href="https://twitter.com/yowa/status/969880059325554688?ref_src=twsrc%5Etfw">2018年3月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a> の回答です。てきとーに道を引いたり草を刈ったり岩を破壊したりする。 <a href="https://t.co/IXM3I1yPG0">pic.twitter.com/IXM3I1yPG0</a></p>&mdash; 2018年こそ夏バテにならない (@tomerun) <a href="https://twitter.com/tomerun/status/969932429828939778?ref_src=twsrc%5Etfw">2018年3月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

植物ツカもが広がっていく様子、ツカもが育ちすぎて岩になる様子、そして参加者の方々が生育領域を制御しながら植物ツカモ効率的に収穫していく様子がわかります。

本選の順位発表時には、上位者の出力を上映するという演出があったのですが、ツカモをどう栽培・収穫していったかが、1000ターンのアニメーションで時間経過ともに流しまして、会場の雰囲気も上々。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ビジュアライザ どよめきが起きてる <a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a></p>&mdash; phyllo (@phyllo) <a href="https://twitter.com/phyllo/status/969900689273925632?ref_src=twsrc%5Etfw">2018年3月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

製作中に使ってたダミーデータとは違う効率的な収穫方法に、ビジュアライザーを作った私自身も楽しませていただきました。

アニメーションの再生ボタン、実装終盤くらいにくっつけたのですが付けて良かったです。（もともと数字の入力でターンを切り替えるUIだった）

本選のページとビジュアライザーは3/8現在まだ動いてますので、実際に触ってみたいという方がいらっしゃったらどうぞ。本選終了後に出場者上位5名の出力ファイルをアップロードしましたので、そちらでもビジュアライザーを動かせます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a><br>本選出場者上位5名の出力ファイルをアップロードしました！<br>会場がどよめいた1位の<a href="https://twitter.com/_tanzaku_?ref_src=twsrc%5Etfw">@_tanzaku_</a> さんの結果を筆頭に、各自の戦略はvisualizerにて一見の価値あり！<a href="https://t.co/QpT8QZdSI2">https://t.co/QpT8QZdSI2</a></p>&mdash; ツカモ (@tsukammo) <a href="https://twitter.com/tsukammo/status/969928995943825408?ref_src=twsrc%5Etfw">2018年3月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 開発小話
で、このお題でビジュアライザーを作ってと言われたのが予選開催しているまさにその日でして、本選は予選の２週間後。
というわけで、実装自体はかなり省エネ。1マスを 1 divタグとして、50×50 つまり 2500個の div を敷き詰め、backgroundにマップチップの画像を設定したclassをつけたり外したりしています。

アニメーションはrequestAnimationFrame。前回3Dシミュレーターを作った知見が生きています。
あとワープホールだけ目立つようにGIFアニメにしています。当初GIFではなくCSSアニメーションでワープホール作ったんですが、CSSでグラデーション＋アニメーションをするとCPU食ってしまったので軽量化のためにGIFアニメに。
ツカモが風でなびくアニメーションもCSSでくっつけてたのですが、処理が重いというのと、あんまり目立たないなっていうので省いています。

ターン行動とマップの連携は @tsukammo さんにおまかせしました。餅は餅屋。

今回ゲームっぽい画面を演出するために、[モンスター集会所！](http://monstermeetingplace.web.fc2.com/)さんの「ぴぽや改変マップチップ」を利用させていただきました。
マップチップのおかげでかなりゲームっぽい雰囲気が出ました。ありがとうございます。

# 当日

懇親会に参加させてもらいまして、いろいろとフィードバックやビジュアライザーのかっこいい競プロサイト等教えていただきました。
今回みたいなビジュアライザーなら、出力データの入ったURL出力とか、アニメーションの動画出力とかあるとTwitterで共有しやすい。という意見を頂いて、ちょっと今度やってみたい。

あと上位者は真っ先に自分でシミュレータを作って点数の計算をさせるという話を聞いて、シミュレーターを補完するような途中経過がみれたり、全体を見渡したりを支援するビジュアライザーにするべきなんだろうなと思ったりしました。

普段は画面の見た目部分ばかり書いてる人なので、競プロガチ勢の方々の話はかなり新鮮で刺激になりました。

改めまして、参加者・関係者の皆さん。ありがとうございました。

# おまけ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/HTTF?src=hash&amp;ref_src=twsrc%5Etfw">#HTTF</a><br>本選・オープンコンテストにご参加頂いた皆様、大変ありがとうございました。至らぬ点も多くありましたが、私が思い描く最高のコンテストを出来る限り体現出来たと自負しております。<br>弊社CTOの感触も良く「次もやろう！1年に1度と言わずもっとやろう！」とのことですので今後もご期待下さい。</p>&mdash; ツカモ (@tsukammo) <a href="https://twitter.com/tsukammo/status/969938441243828224?ref_src=twsrc%5Etfw">2018年3月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

お？ 次回もありそう・・・？