マジック×プログラム プログラミングコンテスト 結果発表

今年4月に開催した「マジック×プログラム プログラミングコンテスト」「マジックプレイヤーのエンジニアの方々が、そのスキルを発揮できる場を提供したい。」という想いから実施した本コンテストには、全13名からのご応募をいただきました。
応募期間は約2週間ほどと短期間ではありましたが、ご応募いただいた作品はどれも素晴らしく、審査員一堂感銘を受けました。ご応募いただいた皆様、誠にありがとうございました。
今回、本コンテストにご応募いただいた作品の中から、特に優秀だった作品を8作品選ばせていただきました。数名の方には、弊社より採用のオファーをお送りさせていただいております。
また、今回のコンテストがご好評いただけたことから、8月には第2回プログラミングコンテストの開催を予定しております。本記事をご覧になってコンテスト参加にご興味をお持ちになった方は、ぜひ弊社のTwitterアカウント @SekappyOfficial をフォローしていただき、コンテストの続報をお待ち下さい。

部門(1) 優秀賞(4名) 受賞作品

部門(1)は実務未経験の方を対象とした課題で、「土地枚数によってマリガン率を計算するプログラム作成」をしてもらいました。今回最も多くの応募者が集まった課題でもあり、中にはGoogleスプレッドシートを用いて制作された作品もありました。
今回は4名の受賞者に、賞品の『基本セット2021』1ボックスをお贈りします。

制作者:24歳 男性

部門1:土地枚数によってマリガン率を計算するプログラム作成(『基本セット2021』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
キープ基準を細かく設定可能です。初期手札にある土地枚数の確率と土地が繋がる確率も確認できます。
審査員の講評
キープ基準の設定や、土地を置き続けることのできる確率の表示などこのまま公開できるレベルで高機能かつUIも整ったツールでした。

制作者:21歳 女性

部門1:土地枚数によってマリガン率を計算するプログラム作成(『基本セット2021』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
数学的な処理を使ってプログラムを作成しました。
審査員の講評
簡潔なコードでまとまっていました。手札枚数と土地枚数の確率テーブルを最初に作成することで、効率の良いアルゴリズムとなっています。

制作者:22歳 男性

部門1:土地枚数によってマリガン率を計算するプログラム作成(『基本セット2021』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
めんどくさがりな僕がいかに楽をするかを考えた結果です。約30分でできたのがアピールポイントです。
審査員の講評
スプレッドシートで実現するのはUIの面で非常にスマートですね。

制作者:28歳 男性

部門1:土地枚数によってマリガン率を計算するプログラム作成(『基本セット2021』1BOXプレゼント)
作品のアピールポイント
3月からの在宅勤務をきっかけにpythonを学び始め、基礎的なインプットを終えたと感じましたので、腕試しに応募いたしました。
部門(3)も挑戦したかったのですが、この企画を締め切り当日に知ったため時間が足りず、間に合いませんでした。ただ、非常にやりがいのある題材だと感じましたので、チャレンジしたいと思います。
審査員の講評
外部ライブラリを使って簡潔にコードがかけています。

部門(2) 最優秀賞(1名) 受賞作品

部門(2)は実務経験3年未満の方を対象とした課題で、「デッキ1人回しWEBアプリ」を制作してもらいました。どのような機能を実装するとより便利になるのか、マジック×プログラムとしての想像力が試される課題です。
今回は痒いところに手が届く便利な機能を多数実装してくださったこちらの作品とその制作者様に、部門(2)の最優秀賞と、賞品の《Underground Sea(3ED)》を贈らせていただきます。

制作者:28歳 男性

部門2:デッキ1人回しWEBアプリ(《Underground Sea(3ED)》プレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
nuxt.jsにて作成しました。以下、要件以外の機能です。
  • サイドボードのカードも他の領域に移すことができます(相棒などを想定)。
  • カードを右クリックすることで、公開/非公開を切り替えられます(占術によるデッキトップ確認などを想定)。
  • 戦場のカードをクリックすることで、タップ/アンタップできます。
  • 「シャッフル」ボタンを押すと、デッキをシャッフルできます。デッキ内の公開状態カードは、自動的に非公開になります。
  • 「ニューゲーム」ボタンを押すと、同じデッキで初手確認からやり直せます。
  • 「デッキ変更」ボタンを押すと、最初の画面に戻ります。
  • カード画像があるものは画像で、無いものはテキストで表示します(サンプルリストのメインデッキ部分のみ入れています。画像の利用はファンコンテンツポリシーの範囲内と認識しています)。
JavaScript / Vue / Nuxtは独学です。コンテストに取り組むことで、自分がどこまでできて何を知らないのか確認することができました。良い機会をいただき、ありがとうございます。
審査員の講評
機能面については、ライブラリーのカードを可視化して、右クリックで反転し確認できるようにした点や、戦場に出したカードを左クリックでタップする機能など、各所工夫がみられて良いと思います。
コードについては、わかりにくい処理には丁寧なコメント付けられていたり、処理ごとにしっかりと関数に分けられているなど、保守性に優れていると感じました。やや複雑な正規表現処理をしっかり行えている点や、シャッフルロジックにしっかりとFisher–Yates shuffleのアルゴリズムを利用している点も抜け目がないです。
vue.js,nuxt.jsは弊社でも社内開発において多く利用しており、すぐにでも活躍できるレベルだと感じました。
注文を付けるとしたら、リスト読み込みの際に構文チェックで間違いがあった場合に「~行目の構文に間違いがあります」などのアラートが出る形なら親切だったかもしれません。また、ライブラリーの中身を確認できる機能があったので、ボトムへ送ったりそのまま手札に加えたりできる機能があればもっと使いやすくなると感じました。

部門(3) 最優秀賞(1名) 受賞作品

部門(3)も実務経験3年未満の方を対象とした課題で、「デッキアーキタイプの自動分類」を制作してもらいました。応募者によって実に様々な分類方法が見られ、とても興味深い作品が多数集まりました。
今回は”デッキに使用されているカードのテキストからアーキタイプを分類する”という手法を取っている作品を寄せてくださったこちらの作品とその制作者様に、部門(3)の最優秀賞と、賞品の《Volcanic Island(3ED)》を贈らせていただきます。

制作者:28歳 男性

部門3:デッキアーキタイプの自動分類(《Volcanic Island(3ED)》プレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
デッキに対して、色、キーワード(あれば)、キーカードorアーキタイプを出力します。色は、カードに含まれる色の和で決定されます。RGなどの多色の組み合わせは、ギルド名や氏族名に変換されます。
キーワードはキーワード能力や能力語などはデッキ名になることが多いため、それらをカードテキスト中から抽出し、デッキ内に一定枚数以上含まれると、デッキ名に追加されます。キーワード能力などの一覧は外部ファイルに保持しており、適宜更新することが可能です。
アーキタイプは、デッキ内に含まれるカードの比で決定されます。デッキに含まれるカードそれぞれに対して、カードテキストからカードをあるフレーズが含まれるかどうかを基準に、単体除去、全体除去、カウンター、ドロー、マナ加速に分類します。また、カードタイプ(土地、クリーチャー、インスタント…)も取得し、それらの比から6つのアーキタイプ(アグロ、ミッドレンジ、コンボ、コントロール、攪乱的アグロ、コンボ)に分類します。比と各アーキタイプとの関係づけは私の経験から決めました。
キーカードはデッキの核になるカード名を表します。デッキの核となるカードを特定するために事前に用意した外部ファイルに、キーカードとデッキ名の対応付けを用意しておき、それらと一致した場合、そのカードをデッキのキーカードとします。
環境が変わるごとに変更が必要そうな物に関しては、外部ファイルによって制御を変えられるよう意識しました。
審査員の講評
カードテキストのフレーズからカードを分類しアーキタイプを推測する手法で、実際に結果も納得の行く分類結果になっています。抽出されたキーカードも納得感が高いです。

佳作

また、惜しくも受賞は逃したものの、他にも素晴らしい作品が見られました。ここでは、そんな作品の中から数点を佳作としてご紹介させていただきます。

制作者:15歳 女性

部門1:土地枚数によってマリガン率を計算するプログラム作成
※画像をクリックすると拡大します。
作品のアピールポイント
Pythonの勉強を始めたばかりでまだ簡単なものしか作れませんが、頑張って作りました。普段の私のキープ基準よりも課題のキープ基準は緩いと思いますが、プログラムを少し変更してキープ基準を変えたところ普段の実感に近くなりました。勉強になりました。
審査員の講評
簡潔で見通しのよいコードです。計算結果の使い回しで処理効率も良いですね。
変数の命名規則やコーディング規約が定まっていない、あるいは一般的なものでないように見受けられるので、その点に気を使うと継続的な開発やチームでの開発に役に立つでしょう。

制作者:29歳 男性

部門3:デッキアーキタイプの自動分類
※画像をクリックすると拡大します。
作品のアピールポイント
デッキに採用されているカードを特徴としてベクトルを作り、機械学習技術を使って分類を行いました。
また、乱数を固定したり、学習済みの結果を再利用したり、再現性を保てるようにしました。
実験的にニューラルネットワークで特徴を学習させ、分類されてみましたが、あまり効果が内容でしたので改良する余地があると思います。
展望として、カード1枚1枚でなくカードタイプごとの比率を特徴として分類する、分類方法にほかのアルゴリズムを利用するなどを機会があれば試したいと考えております。
審査員の講評
機械学習を用い、キーワードやカード名を追加すれば柔軟に分類方法を変えられるようになっていて、完成度が高いです。
今回お寄せいただいた作品はどれも素晴らしいものばかりでした。改めてご応募いただいた皆様には心よりお礼申し上げます。
また、今回のプログラミングコンテストで多くのエンジニアの方からご応募をいただいたことを受けて、今年8月に第2回プログラミングコンテストを開催することを決定いたしました。詳細については追って弊社のTwitterアカウント @SekappyOfficial より告知させていただきます。
本記事をご覧になってコンテスト参加にご興味をお持ちになった方や、腕試しをしてみたいという方、あるいは上位賞の賞品が欲しいという方は、ぜひ次回のコンテストにご応募ください。
このたびは多数のご応募誠にありがとうございました。