バンダイナムコスタジオのオンラインテスト感想

バンダイナムコスタジオ様のオンラインコンテストがathletics様から応募を受け付けていたので参加させていただきました。

企業が行っているコンテストに参加するのは初めてだったので緊張しました。

athletix.run

(開催は既に終了しています)

 

内容

簡単に説明するとC++で球と三角形(ポリゴン)の衝突判定を行い、どれだけ正確に・高速にできるかを競う問題でした。

テストケースは複数与えられます。1つのテストケースには三角形と複数の球のパラメータが与えられ、球一つ一つに対してどれだけ三角形が衝突しているかのカウントを出力します。球のカウントが想定解とどれだけあっているのかの正答率を高くするコードを書く必要があります。

f:id:ky0ichi:20200920183629p:plain

三角形と球の例

注意するべきこととして、三角形は球の内部ではなく球面に交差もしくは接していると衝突した判定になるというものです。単に三角形と球の中心との距離が球の半径未満であるというコードでは不十分です。

f:id:ky0ichi:20200920184224p:plain

球と三角形の衝突判定の可否(球面に接している三角形のみ衝突した判定に)

 

コンテスト開催中に感じたこと

コンテスト開催期間中、参加者のスコアのランキングが日々Slackで更新されるのが自分にとっては新鮮で面白かったです。他の参加者とスコアを比較したり(上位の人たちと自分のスコアに驚いたり)、アルゴリズムを変えたことによるスコアの向上を見れたりなど楽しかったです。

また、Slackで気軽に質問することもでき、フィードバックも早かったのでとても助かりました。

コードはブラウザ上の特定のサイトで実行・提出するのですが、実行時テストケースがどれだけあっているのかが見やすかったです。(ファイルを分割して実行することもできたようですが、やり方が最後まで分からなかったです…)

 

反省

工夫した点は

  • 小数を10倍して整数で管理(すべての入力で小数点以下は1桁なので)
  • 球とポリゴン間の距離を比べるとき、距離をsqrtで算出しない
  • 座標をVec3クラスで管理(演算子のオーバーライドも定義しコードを簡略化)
  • 8分木で空間全体を分割し、球に近いポリゴンしか判定を行わないようにする

コンテストの結果は9位でした。ここまで高い順位になるとは思ってなかったのでとても嬉しかったです!

 

反省点は

  • 8分木で空間分割をしたとき、球が属する空間とそれに隣接する6つの空間も探索すればよかった(球と三角形が空間を隔てて接していた場合を判定できない)
  • 公開されていたテストケースのうち、一つ正答できていなかったので、原因を探りたかった

などなど…

他の参加者には自分では思いつかなかった工夫をしている人もいました。自分はまだまだ知識が足りないことを痛感しました。

 

さいごに

コンテスト終了後の参加者のランキング発表や懇親会はとても楽しく、有意義な話が聞けてすごい良かったです!このコンテストを提供してくださったバンダイナムコスタジオ様、本当にありがとうございました。