Sekappy プログラミングチャレンジに挑戦してみた。

f:id:caesarcola:20200824151407j:plain

 

・事の始まり

 私はカエサル、黒のプレインズウォーカー、好きな呪文は『骨読み』だ。

 

 何を言っているのかわからない? プレインズウォーカーというのは、トレーディングカードゲームマジック:ザ・ギャザリング」のプレイヤーのことだ。しかし、今日はマジック:ザ・ギャザリング(以下マジック)の話ではない。プログラミングの話をする。だが、マジックの言葉も使っていくので、マジックがわからない人が読んでも何のことやらわからない記事になるだろう。

 

 さて、マジック……プログラミング……なぜ? と思うだろう。それには少し説明が必要だ。まず、「Sekappy」という、社員全員がマジックプレイヤーという特徴を持つ会社がある。その「Sekappy」が、プログラミングチャレンジというイベントを開催したのだ。

f:id:caesarcola:20200824151457j:plain

(参考URL:https://sekappy.com/blog/2071

 細かい話は省くが、要するに、「出題されたプログラミングの課題をこなし、優秀な成績を収めれば商品がもらえる」というイベントだ。そして課題1(実務未経験者向け)の商品を見てみると……マジックのブースターパックを1BOX! これはスゴいことだ! TCGプレイヤーは総じて三度の飯よりブースターパックが好きだ。これを商品にするということは、この「Sekappy」という会社が本気であるということに他ならない。私は本能に近い部分でそれを理解した。

 

 更にどうやら優秀な作品を提出した参加者には採用のオファーまであるらしい。オファー! 甘美な響きだ。これは現在働き口を探している私にとっても僥倖と言えた。こうなればもうやるしかない。私はその覚悟を決めた。

 

 つまりこの記事は、この「Sekappyプログラミングチャレンジ」に挑戦した記録を残した記事ということだ。ある意味「株式会社Sekappy」への手紙という面もある。それがラブレターなのか、呪いの手紙なのかはわからないが。

 

 しかし、ここまで書いておいて、筆者である私にプログラミングのスキルはあるのだろうか?  実務未経験者向け課題があるとはいえ、全くのゼロからというわけにもいかないだろう。

 

 結論から言うと、全くのゼロからと言えた。

 

 私にとってプログラミングとは、コンピュータという現代のアーティファクトを用いキーボードをガチャガチャとやって神秘的なシステムや装置を生み出す行為だ。まさしく青の魔導士の領分だ。黒のプレインズウォーカーである私にはこれまで関係が無いと思っていた。目の前のパソコンは文章を入力するかイラストを描くことくらいにしか使ったことがないし、プログラミングをどうやってやっているのか見当もつかない。

 

 それでも、私はなんとかなるだろうと思っていた。何故か? 青と黒は友好色だからだ。

 

・3マナ3/2 ダブルシンボル

 

 さて、それではプログラミングというものを進めていく。まずは課題の確認だ。私が挑戦する初心者向け課題は以下の通りだった。


【課題1】(実務未経験者向け):パック開封シミュレーター
M21のカードリストと、レアリティ毎の封入確率に基づいたパック開封のシミュレーターを作成いただきます。


 パック開封シミュレーター…………つまり、アリーナのアレをつくれということか。

f:id:caesarcola:20200824151603j:plain

f:id:caesarcola:20200824151613j:plain

↑アリーナのパックは8枚だが、今回の課題はFoilも考慮に入れた通常のドラフト・ブースターパックのシミュレーターだ。



 課題の詳細を読むと、どうやらここまで凝ったものではなく、パックの開封結果がわかる文字列を表示させることができれば良いらしい。詳細にはシミュレーターをつくるにあたっての細かい条件などが記載され、そして続けてソースコードの推奨言語という記載があった。

 

 ソースコード……というのはプログラミングで書く文字列のことだろう。先ほどプログラミング経験はゼロと書いたが、正確には学生時代に半年ほどだけパソコンの前に座って受ける授業があったことを覚えている。内容はほぼ全く覚えていないが…………パソコンの画面に「printf hello world」と入力したことだけは記憶していた。なので、その「推奨言語」というのが、どんな種類のプログラミング言語を用いるかという話だということはわかった。

 

 そして私はその言語をひとつ選んでプログラミングしなければならない。推奨言語にはこう並んでいた。(PHP, Ruby, Python,C, C#, C++, Java, JavaScript

 

 ……PHP? PHP文庫なら知っているが、文庫本は今は関係ないだろう。Ruby…………ルビーってのは七月の誕生石だ。JavaJavaScriptっていうのは同じじゃないのか? C,C#,C++…………何のことだ? Cを転生させまくるとC++にでもなるのだろうか?

f:id:caesarcola:20200824151738j:plain

javajavascriptはウギンとウギンのきずなくらい違うらしい

 

 そのとき私にとって、ぱっと見どの言語を選んでも同じように思えた。結局どれも未経験なことを考えると、どれを選んでも変わらないだろうと思ったのだ。なので一番最初に書いてあったPHPを選ぼうかと思ったその直後、私に直感が走った。いや、それは直感というよりはプレインズウォーカーとしての勘というべきだろう。黒のプレインズウォーカーとしての。

 

 Python。その文字列を見たとき、私の、いや黒のプレインズウォーカーの脳裏に浮かぶのはプログラミング言語ではなくこちらだった。

 

f:id:caesarcola:20200824151808j:plain

1997年のカード。イラストもフレーバーもクールだ。



 ニシキヘビ/Python。黒の3マナ3/2のバニラクリーチャー。マジックのパック開封シミュレーターを作成するのにこれほど適した言語名もないだろう。それに気づいた直後、私は、Googleに「Python プログラム初心者」と入力して検索ボタンを押していた。

・熟読

 プログラミングとは何か…………それはGoogleで検索したページを読むことだ。私はそう勘違いするほど、最初はただただWebページを読み続けた。プログラミング初心者の私は何から始めたらよいかはわからないが、私にはグーグル検索がある。グーグル検索さえあればこの世のだいたいのことはわかるので、私は「Python 始めかた 簡単」「Python ゼロから 初心者」「Python MTG デッキ」などで検索をかけ続けた。

 

 そして知ったことを少しづつ組み合わせ、私はプログラミングという道に入門し始めた……。Google Colaboratory というwebページを使うと環境構築というものをしなくてすぐにプログラミングを始めることができるらしい。さらにどうやらPythonは割と初心者向けらしくコンパイルというのも必要ないらしい(コンパイル? ぷよぷよを開発した会社は関係ない)。また、Pythonはプログラムする上で使用できる機能をまとめた「ライブラリ」というものも最初から充実しているらしい。(ライブラリ! またマジック用語だ! やはりこの言語を選んだのは間違ってなかった!)「らしい」ばかりで正直私には何が便利なのかよくわからなかったが、選んだ言語が初心者向けと言われればいくらか気楽にはなるものだった。

 

 そしていよいよ、実際にコードなるものを入力してみた。まずはプログラムを入力し、文字の表示を出力する練習だ。

f:id:caesarcola:20200824151918j:plain



 プログラミング初心者には初歩として「Hello World」と表示させる慣習があるらしいが、私はプレインズウォーカーなのでアンタップアップキープと宣言させてもらった。つまり、このコードは実行した後に「Untap Upkeep」と表示する、というプログラムなのである。これを発展させまくり、今回の課題に取り組んでいく。一行目の#から始まる文章はコメントといい、直接プログラムのコードには意味は無いが後から人間が読むときようの道しるべだという。
 
 私が次に入力してみたのはこれだ。

 

f:id:caesarcola:20200824151942j:plain



 

 ちゃんと計算できている。Pythonにもマジックがプレイできそうということがわかった。

 printで出力、また計算を行うことができたら、プログラミングは半分できたようなものだ。後は、IF式というものだ。これはコンピュータに、「AだったらBをしろ、AじゃなかったらCをしろ」という命令をするものだ。今回の課題でいうと、「神話レア(M)が抽選されたら神話レア(M)のカードプールから一枚出力しろ。神話レアじゃなかったら通常レア(R)のカードプールから一枚出力しろ。」といった風に使う。

 

 ここまでで大体のカードは揃った。追加は繰り返し関数(While)とか乱数(Random)などを使うくらいだ。

 

 さて、ここからは実際に課題のコードを書いていく。しかし、ここでその詳細には触れない。何故なら、別に面白いことはないからだ。これはプログラミング初心者の私の感想だが、プログラミングというのは当たり前の繰り返しだ。コンピュータはミスをしない。「AだったらB」という命令を出せば、100回やって100回同じ結果が返ってくる。そこに偶然はない。先ほどのprintやらなんやらを組み合わせ、当たり前を重ね合わせた結果、プログラムが組み上がるのだと思った。

 

 それでは、コードをスイスイ書いていけたかと言うと、全く何も順調ではなかった。エラーの奔流だった。さっきと同じことをやってるはずなのにエラーが出たりすれば「コンピュータもミスするじゃねえか!!!」と絶叫したり、Webページの例文をコピー&ペーストをしたはずなのにエラーが出ると「嘘書いてんじゃねえか!!!〈誤った指図/Misdirection〉!!!!!」と血管が切れそうになったりもした。(後にどちらも自分のミスと発覚した。大変恐縮である。)

 

 しかし、それを解決したのはいつもGoogleだ。エラー文章を検索窓に入力すると、いつも誰かしら先人が知恵を残してくれていた。知識・技術の結晶、インターネットという情報集積体、まさしく青のカラーパイだ。私はそれを読み、コードを入力し、テストし、何度でもトライ&エラーをする。その繰り返しで進めていった。

 

f:id:caesarcola:20200824152015j:plain

グーグルという土台の上に私のプログラミングは成り立っていた。

 

 やがてそれは完成した。時間はとてもかかってしまったが、結果としてカードの羅列を出力するコードを完成させることができた。Sekappyの課題詳細には、


・コードの保守性
・利便性(UI/UX)
・アイデアの独自性
アルゴリズムの効率良さ


等の評価基準があった。その観点で自分のコードを見てみると……とてもじゃないが褒められたモノではないだろう。熟練者が書けば半分、いや十分の一にできるのではないかいうほどに私のコードは長いし、ひとつひとつ該当のレアリティが抽選されるまで乱数での抽選を繰り返すという私が作ったアルゴリズムはとても効率が良いとは言えない。(特に黒のプレインズウォーカーとして、効率が悪いというのは悔しいところだ)

 

 だが、時間制限のある中での私の全力は出した。そしてそれを提出する。結果が気にならないと言えば嘘になるが、私は「青」の一端を垣間見るという大変有意義な経験をしたと思う。その経験値を大事にし、今後は糧にしていきたいと感じた。最後に、実際に私が書いたプログラムを実行してみて、つまりパックを開封してみてこの記事の締めにしたいと思う。

 

f:id:caesarcola:20200824152218j:plain

 

 ここで青黒のレアでも出れば記事の締めに完璧と思っていたのだが、基本セット2021に青黒のレアは収録されていないのだった。カードプールを把握していない、これでは<初心者の過ち/Rookie Mistake>だ。

f:id:caesarcola:20200824152258j:plain

 

 

Twitter:@caesarcola