このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
皆さん、こんにちは! エンジニアの二木です。今回は ICFP Programming Contest (ICFPC) への参加記です。
ICFPCとは国際関数型言語学会(The International Conference on Functional Programming; ICFP)の主宰するプログラミングコンテストで世界各国が参加する国際規模のイベントになります。毎年夏ごろに開催され、期間は3日間のチーム戦で、最初の1日目までの提出プログラムで競う部門(Lightning contest)と3日間すべてを使って競う部門(Full contest)の2部門があります。
問題を解くために72時間が与えられますが、難易度は総じて高く、アルゴリズム開発、インフラ構築、ビジュアライザ作成など実装にも時間が掛かることが多いので、効率よく開発していく必要があります。因みにチームには人数制限はありません。
フィックスターズではプログラミングコンテスト好きが多いので毎年有志を募ってICFPCに参加しています。2011年から参加しているので今年で7年目になります。参加当初は勝手が分からず100位あたりでしたが、近年では10位前後ぐらいをウロウロしています。因みに、これまでの最高順位は2013年の2位でした。
そして今年もICFPCに参加するために社内で有志を募ったところ、6名のメンバが集まり、例年と同じく合宿形式で参加することになりました。
今年は三浦海岸駅近くのホテルで4泊5日の合宿になりました。宿泊代と旅費はすべて会社で出してくれます。また、宿泊についてもすべて手配していただいています。いつもありがとうございます!
さて、毎年宿泊先の条件として次の3項目を挙げています:
3番目に挙げた温泉は重要で、精神力が削られる72時間を乗り切るための切り札となります。
また、これまでのICFPC参加の経験から、以下の事柄が大事であることを学びました。
スケジュール管理
- 時間の配分
- 作業の調整
情報の共有
- Wikiやホワイトボードを利用
- 定期的な短いミーティング
課題の理解・共有
- できるだけ早期に
- 課題が出されて1時間後ぐらいに内容を共有・すり合わせ
作業環境
- 開始前に確認
- 慣れているツールを使う
- 新規に利用するツールがあるなら事前に確認
新規に参加するメンバもいるので事前によく理解してもらってから挑みました。
関数型プログラミングの継続的な人気と関数型プログラミング言語でのラムダに対する需要の増加に伴って、ボトルネックはラムダ鉱山から輸送ネットワークに移ってきている。君の仕事は、ラムダ鉱山から世界中のプログラマへラムダを運ぶためのパントの舟路を決めることだ。君は他のパント乗りと競争して、最高のラムダパント乗りとして勝利しよう!
これが今年の問題です。因みにパント(punt)とは平底で両端が方形の舟のことです。
これだけだと意味が分かりませんが、要はあるノード(mine; 鉱山)からエッジ(river; 川)を伝ってできるだけ長い距離を取るゲームになります。つまり、グラフに対する辺取り合戦ですね。細かいスコアの決め方などはリンク先の説明を読んでみてください。
余談ですが、ちょうどこの合宿と同日に開催されていた社内のボードゲーム会で「チケット・トゥ・ライド」というゲームをプレイしていたそうなのですが、これが今年のICFPCの問題と似たルールで、面白い偶然もあるものです。
さて、4泊5日の開発内容を順を追って箇条書きで列挙してみます。
今回作成したビジュアライザです。ビジュアライザがあるとないのとではAI作成の開発のしやすさは段違いです。また、目で見えるのが単純に楽しいですし、モチベーションの維持にもつながっています。つまりビジュアライザは大事!
今回の結果は以下の通りでした。
The \$ound of .\ and fixstars both did very well on the Edinburgh map, scoring an order of magnitude more than other teams. However, fixstars had problems with the coauthor map and so The \$ound of .\ are a long way ahead.
毎年のことですが、72時間集中のコーディングは精神力をかなり削られます。なので、快適なコーディング空間とか、温泉でリフレッシュとか、美味しい食事とか、こういった環境がとても重要だったりします。
そして、業務と同じようにスケジュール管理がとても大事であり、いかに効率よく、それぞれのエンジニアが協力し合ってコードが書けるかを、3日間に凝縮しているわけで、チームで開発するという経験だけでも素晴らしい価値があると思っています。これって会社で開発しているプロジェクトの縮図のようであって、なかなか面白いですね。
結果については、コードの検証時間がもう少しあれば…とも思いましたが、条件はどのチームも一緒でどこも多かれ少なかれバグはあるんだろうなと思います。これを経験としてより良いやり方を考えるのが大事ですね。
さて、来年のICFPCにも参加する予定ですので、今後もよろしくお願いいたします!
keisuke.kimura in Livox Mid-360をROS1/ROS2で動かしてみた
Sorry for the delay in replying. I have done SLAM (FAST_LIO) with Livox MID360, but for various reasons I have not be...
Miya in ウエハースケールエンジン向けSimulated Annealingを複数タイルによる並列化で実装しました
作成されたプロファイラがとても良さそうです :) ぜひ詳細を書いていただきたいです!...
Deivaprakash in Livox Mid-360をROS1/ROS2で動かしてみた
Hey guys myself deiva from India currently i am working in this Livox MID360 and eager to knwo whether you have done the...
岩崎システム設計 岩崎 満 in Alveo U50で10G Ethernetを試してみる
仕事の都合で、検索を行い、御社サイトにたどりつきました。 内容は大変参考になりま...
Prabuddhi Wariyapperuma in Livox Mid-360をROS1/ROS2で動かしてみた
This issue was sorted....