こんにちは!
システムアーキテクト見習いの小池@テックイベント運営エンジニアです。
11 月に開催したエムティーアイハッカソンについてお伝えします。
目次
エムティーアイハッカソンとは
弊社では年に 2 回のペースで社内ハッカソンを開催しております。
これまでのハッカソンでは毎回テーマに沿ったサービスやシステム案を各チームで出し合い、そのプロトタイプを 2 日間で実装してプレゼンするという形式で行っていました。
※ 過去のハッカソン開催レポートはこちら tech.mti.co.jp tech.mti.co.jp
5 回目となった今回のハッカソンでは今までと趣向を変えて、競技プログラミング形式のハッカソンを開催しました!
とあるゲームのプレイヤーを実装し、各チームのプレイヤー同士で対戦させて最も強いプレイヤーを決めるというものです。
今回は「技術やロジックに重きを置いたハッカソンを実施しよう!」ということで、運営スタッフとしても初めての試みとなる競技プログラミング形式を採用しました。
(このときはまだ、準備があんなに大変だとは思ってなかった・・・。運営スタッフの奮闘記『俺達の "裏" ハッカソン』近日執筆予定(?) 乞うご期待)
その名も「SuSoku」
競技プログラミングのテーマとなるゲームは「SuSoku (数測/すうそく)」です。*1
これは、数字当てゲーム Hit & Blow のオリジナルルール版です。*2
1 対 1 の対戦形式で、相手が隠している数字を早く当てたほうが勝ちとなります。
数字の組をコールすると返ってくる Hit(数字も桁も正解)の数、Blow(数字は正解だが桁が違う)の数をヒントに正解の数字にたどり着きます。
また、プレイヤーは数字の組をコールする前にアイテムを 1 試合につき 2 つまで使用することができます。 アイテムは大きく 2 タイプあり、相手の数字の組を推測するのにヒントとなる攻撃アイテムと、自分の数字の組を相手に推測させにくくさせる防御アイテムに分けられます。*3
このゲームルールに沿ったプレイヤーを実装して、大会で勝つことが今回のハッカソンの目標となります。
プレイヤーをデプロイする環境は運営スタッフが指定した AWS Lambda としました。
実装開始!
今回は 9 チーム 17 名のエンジニアが参加してくれました。
ハッカソンの開催告知では「Hit & Blow をベースとした数字当てゲームのプレイヤーを実装して戦わせる」という情報しか公開していません。
したがって参加者はアイテムについての情報や大会ルール、ゲームサーバーのインターフェイスなどはハッカソン当日の朝に初めて知ることとなります。
効率的な Hit & Blow ソルバを作るだけでも頭を使うのに、アイテムがあることで、アイテムを使うかどうかのロジックや逆に相手がアイテムを使った場合の導出ロジックに参加者は頭を悩ませていました。
このハッカソンでプレイヤーを実装する上でキーとなるのが、いかに "強い" プレイヤーを実装するかということです。 アイテムすべてを実装することが必ずしも大切ではなく、戦略的なプレイヤーを限られた時間の中でいかに実装できるかが重要です。
各チームとも戦略を練り、それをどう実現させるかを何度も議論して一生懸命に取り組んでいました。 応答時間の制限もあるため、そこも参加者の腕の見せ所です。
……そんな中、運営スタッフはゲームサーバーのバグ取りや対戦結果のビューワー実装と必死こいて戦っていました。
いざ、勝負!
プレイヤーのデプロイ締め切り後、運営スタッフによって対戦が執り行われました。
後日、会場に集まったオーディエンスの皆さんとともにビューワーで対戦過程と結果を見ながら結果発表を行いました。
予選リーグ
参加チームを 3 チームずつの 3 プールに分け、総当たり戦で行います。
チーム毎にそれぞれ 6 試合ずつ対戦し勝数を競い、各プールの 1 位が決勝に進みます。
また、各プールの 2 位同士で敗者復活戦を同様に 6 試合の総当たり戦で行い、勝ち残ったチームも決勝トーナメントに進出しました。
ここまでの対戦では、0 から 9 の数字の中から 4 つ選び、4 桁の数字を作って推測し合うというルールです。
対戦結果は次のとおりです。
プール A
順位 | チーム名 | 勝ち点 |
---|---|---|
1位 | Motoking | 9 |
2位 | Mao | 7 |
3位 | 樋口 | 2 |
プール B
順位 | チーム名 | 勝ち点 |
---|---|---|
1位 | とにかく明るい石脇 | 7 *4 |
2位 | JGRC3 | 7 |
3位 | のぶ屋 | 4 |
プール C
順位 | チーム名 | 勝ち点 |
---|---|---|
1位 | チーム影武者(仮) | 11 |
2位 | 脳筋 AI | 4 |
3位 | HP | 3 |
敗者復活戦
順位 | チーム名 | 勝ち点 |
---|---|---|
1位 | JGRC3 | 11 |
2位 | 脳筋 AI | 7 |
3位 | Mao | 0 |
決勝トーナメント
決勝では、それぞれ1 本勝負のトーナメント形式で行いました。 数字のルールも 0 から 15 の中から 5 つ選択するように変わり、難易度が増しています。
そして最終結果は以下のようになりました!
第 4 位
Motoking
新卒 1 年目エンジニア 2 人組のチーム。
惜しいところまで相手を攻め込むも最後の一手に欠ける結果となってしまいました。
先輩からの強い推しにより出場させられたという経緯がありますが、見事健闘しました!
第 3 位
JGRC3
ハッカソン出場 3 回目となるベテランエンジニア。
攻撃アイテムを使用しないという平和的戦術で敗者復活からの見事入賞を果たしました。
準優勝
とにかく明るい石脇
ハッカソン常連メンバーを含む若手チーム。
決勝トーナメントでは桁数と使用可能な数字が増えたことにより計算時間がサーバータイムアウトに間に合わず、何度も無言コールをしてしまうという場面がありました。
それでも奇跡を起こし、会場を沸かせてくれました!
優勝
チーム影武者(仮)
中堅エンジニア 3 人チーム。
なんと TDD を実践し、手堅く強いプレイヤーを実装してきました。
ソルバロジックも練られていて、しっかり "強い" プレイヤーを実装して見事優勝を勝ち取りました!
After Party
結果発表後にハッカソン後恒例のビアバッシュを行いました。
そこでは参加チーム同士でエキシビションマッチを行ったり、互いのロジックを説明したり、ソースコードを見せ合ったりするシーンがありました。
このような光景は今までのハッカソンではあまり見かけなかったものですね~。
エキシビションマッチでもしっかりと強さを見せた優勝チームはさすがです!
最後に
今回のハッカソンでは、初の試みとなる競技プログラミング形式で開催しましたが、どのチームもレベルの高い成果物を制作してくれ、大変盛り上がったイベントとなりました。
参加者やオーディエンスの方々からも高評価をいただけて、運営スタッフも嬉しい限りです!
またいつかのハッカソンでもこのような形式で開催できたらいいなと企みつつ、もっと盛り上がるイベントを企画していきたいと思います!
参加してくれた皆さん、運営に携わってくれた皆さん、本当にありがとうございます!
ではまた!