マジック×プログラム 『冬のSekappyプログラミングチャレンジ』結果発表

毎回、マジック×ITの学びの機会・腕試しの場としてご活用いただいている本イベント。今回も過去の開催に負けず劣らず、数多くのご応募をいただきました。ご応募いただいた皆様、誠にありがとうございます。
※各課題の詳細はこちら
今回は、特に優れた作品をお送りいただいた4名の方に賞品を進呈いたします。また、数名の方に弊社より採用のオファーを、ご応募くださった方全員に参加賞となるスリーブをお送りいたします。
なお、Sekappyでは今後もプログラミングチャレンジを実施予定です。最新情報は弊社の公式Twitterアカウント @SekappyOfficial から発信しております。ぜひフォローいただき、続報をお待ちください。
それでは以下、優秀作品の発表です!

部門(1) 優秀作品(3名)

実務未経験の方を対象とした部門(1)のお題は、名付けてn枚めくりの確率計算機。
《軍団のまとめ役、ウィノータ》や《集合した中隊》といった、「ライブラリーの上から○枚を見て、特定のカードを出す」能力。デッキに何枚の”当たり”を入れると何枚がヒットするのか?そんな確率と期待値を計算するプログラムを作成いただきました。
3部門の中でももっとも多くのご応募を頂戴した本部門。今回は、特に素晴らしい作品をお寄せくださった3名の方に『カルドハイム』日本語版ドラフト・ブースター1ボックスをお贈りいたします。

制作者:22歳 女性

部門1:n枚めくりの確率計算機(『カルドハイム』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
前前回も組み合わせの問題を提出しましたが、mathライブラリでそこそこ速い処理ができるようになっています。
また、エラーがでても回避できる設計になっています。
審査員の講評
全体的にソースコードが綺麗に掛けており、計算にも無駄が無かったです。
また、関数の分割も簡潔に出来ており、やりたい内容と必要なソースのバランス感もとても良かったです。
  • めくる枚数と選べる上限枚数が同じ(《発生の根本原理》など)時の考慮が抜けている点
  • 演算子周りの表記の統一感がない点
  • 入力チェック判定が無い点
  • エラーメッセージのバリエーションが無い点
を改善すればさらに良いアプリになるでしょう。

制作者:22歳 男性

部門1:n枚めくりの確率計算機(『カルドハイム』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
確率計算システムをクラスとして用意し、それを呼び出す形で実装した。
計算を細かく関数分けし、それぞれの関数ごとにテストをして正しい計算ができているかを検証している。
複数回計算するであろう値はあらかじめ計算しておくことで、計算リソースの節約を心掛けている。
確率が正しく計算できない場合には再入力を促すことで、利用者のタイプミスによってデッキ枚数の論理的関係が崩れた場合にもストレスなく使えるように設計している(デッキ枚数60枚に対し、当たり枚数が266枚のような入力をしてしまった場合など)。
審査員の講評
とても手が込んでいてしっかり作れていると思います。提示した要件で可能な限り良いものを作ろうという気概を感じました。
内容もPythonの規約にしっかり則って丁寧に書かれており保守性も高いです。
単体テストが付いている事には驚かされました。
成功時/失敗時での再入力を促してくれたりするのは利便性の面から見て良かったです。
毎回計算をするアルゴリズムになっていない点も効率面から見て優れています。
正常な数値を入れていても当たりが少ない(当たりが2/60の際に5枚めくり5枚上限にした場合など)とエラーになってしまうので、そこが無ければ完璧でした。

制作者:23歳 男性

部門1:n枚めくりの確率計算機(『カルドハイム』1BOXプレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
  • コンビネーションの計算は重くなりがちだったので、できるだけ重くならない方法を探しました。
  • 計算式は、見やすさ、流用しやすさ等を考慮してできるだけシンプルにまとめることを心掛けました。
  • 入力項目が多いので、コマンドプロンプト上で起動しても見やすいよう改行や表示方法に気を付けました。
審査員の講評
Pythonの規約に模範的に書けており、関数もきっちりしており、全体的に良くまとまっています。
分母の使いまわしが出来ている点も高評価です。
printf()内の改行が不規則なのは気になりました。
数値チェックも実装されていましたが、エラーメッセージが無いのは心許ないところです。
自分以外の人が使う事を想像して書けていると更に良くなるでしょう。

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

実務経験3年未満の方を対象とした部門(2)の課題は、目標戦績計算機。
「何勝すればトップ8?」「何敗までは大丈夫?」といった疑問に答える、戦績を計算するプログラムを作成いただきました。
条件付けに一工夫も二工夫も必要だったこちらの課題。中にはGoogleスプレッドシートを使って作られた意欲作もありました。
今回は、計算にパスカルの三角形を取り入れ、特に処理時間が短かった、効率性と独自性に優れたこちらの作品を最優秀賞とさせていただきます。製作者様には、賞品として《Underground Sea(3rd)》[PLD]を進呈いたします!

制作者:28歳 男性

部門2:目標戦績計算機(《Underground Sea》プレゼント)
※画像をクリックすると拡大します。
作品のアピールポイント
前提条件をいくつか定義しました。
(1)大会のラウンド数について、大会参加者が128人までの場合は2のn乗に対応するラウンド数でスイス式イベントは開催されますが227人を超えるとその法則が崩れます。
理由としては227人~256人の人数でスイス8ラウンドの場合、7勝1敗でもTop8に残ることができないためです。
本来であれば大会ではTop8を目指すので227人~256人での大会はスイス9ラウンドで行われますが本課題ではTopいくつに残りたいかを任意に設定できるので227人~256人でもスイス8ラウンドで行うように設定しています。
257人以上についてもラウンド数は2のn乗に対応するものとしています。
(2)課題説明の[条件]
  • プレイヤーのID(*2)は他のプレイヤーのIDを前提とせずに確実にトップYに残ることができる場合にのみ行われるものとし、それ以外の引き分けは発生しないものとします。
  • OPP(*3)は同点ラインで最下位とし、下当たり(*4)した場合はIDが成立しないものとします。
について、Top8を目指す通常のスイスラウンドであれば2回IDをすることによってTop8が確定する状況があります。
例えば残り2ラウンドを残して全勝者が2人しかいない場合などに起こり得ますが1度IDをすると後者の条件より必ず下あたりが発生し、そこではIDを出来ないので2回のIDで目標順位Yを達成することが無いとしています。
下当たりが発生する場合、最終ラウンドでIDをしたとしても目標順位に入ることができないケースなど様々な状況について考察し記述しました。
大会の参加人数とスイスラウンド数が決まれば総勝ち点の総数が決まるのでそこから上手く計算することで目標順位Yを達成するための勝敗数を求めることができるかと思いましたが良いアルゴリズムを作ることができず残念です。
結局、下当たりした対戦組合わせでは勝ち点が多いほうが常に勝つor勝ち点が少ないほうが常に勝つ、という2通りについてナイーブに各ラウンド毎の各勝ち点の人数を出し、最悪ケースの成績を求めるという方針を取りましたが何か想定解のようなものがありましたら教えて頂けると幸いです。
審査員の講評
  • アルゴリズムについては計算数削減のためにパスカルの三角形が使われており処理速度が考慮されている点を効率性・独自性の観点から評価しました。
  • 入力値に対するエラーハンドリングを実装している点が良いですね。
  • 命名規則については一貫性があり問題ありません。
  • アルゴリズム周りで次の2点から読みづらさを感じました。
  1. コメントが少ない点。数式やfor文、if文が連続してネストしている箇所は意図が読みづらく、コメントでの補足が欲しいと思いました。
  1. 似た関数が複数書かれている点。同じ役割を持つ関数は可能な範囲でコードをまとめていただけるとより可読性が高いものになったと思います。
  • 参加者が少人数の場合での出力結果に誤りが見られます。参加者16人で3位を目標にすると4勝0負0分と表示されますが、正しい結果としては3勝0敗1分を想定しています。下当たり組み合わせの処理に一部見直しが必要かと思われます。

部門(3) 該当者なし

部門(3)は実務経験の有無を問わず、参加受付・対戦組み合わせの作成・対戦結果の入力・順位の算出まで一通りこなせる、大会運営プログラムを作成いただくものでした。今回、本部門については該当者なしとなります。
我こそは!という方、ぜひ次の機会にご参加ください!

終わりに

ご紹介は以上となりますが、惜しくも選外とさせていただいた作品も素晴らしいものばかりでした。改めて、ご応募くださった皆様に御礼申し上げます。賞品も順次発送しておりますので、到着をお待ちいただければ幸いです。
Sekappyでは、これからもマジック×ITを盛り上げるべく、プログラミングチャレンジを継続開催してまいります。本記事で企画を知られた方、自分のスキルを試してみたいという方、賞品獲得を狙っちゃおう!という方、ぜひ次回の開催を楽しみにお待ちください。
この度は多数のご参加、誠にありがとうございました。