key

WORLDis DescribedInMathematics

この文章を書いたのは?

近藤 祥子

数学で変わるプログラムコード

こんにちは!近藤祥子と申します。ハッカーズバーでハッカーとして働いています。

ハッカーズバーは、「ハッカー」の店員がお客様の要望にあわせてライブでプログラミングをしてくれるバーで、初心者からITの専門家まで、お酒を飲みながらITの話題を楽しめるお店です。ハッカーというと、悪い人を想像する方もいらっしゃいますが、IT業界においてはハッカーとは、とても優れたエンジニアを尊敬して表現する言葉で、むしろ良い意味で使われることの方が多いです。

さて、ハッカーやプログラマーというと「数学が得意な理系男子」を思い浮かべてしまいがちですが、私はむしろその真逆を走っています。理系でも数学が得意というわけでもありません。

【数学が好き】
数学が得意かということと数学が好きかということは別で、私は数学が好きです。
物事を深く考える・追求する事はとても楽しいことです。

【あるパズルゲームの流行】
2048というパズルゲームが流行したことがあります。
ルールは簡単で、4×4のタイルに表示された数字を1回の操作ごと、上下左右の指定した1方向に全てのタイルを動かせるだけ動かして行き、同じ数字のタイルを重ねてより大きな数字のタイルを作っていくというものです。

動かした方向に同じ数字が並ぶとそれらが重なり、数字が2倍になった1枚のタイルになると同時に、空いた領域にはランダムな場所に新しく「2」または「4」と書かれたタイルが1枚が追加されます。

この新しいタイルがすぐに他のタイルに重ねられるとよいのですが、その位置によってはうまく重ねられず、タイルが画面全体に敷き詰められてしまって動かすことができなくなるとゲームオーバーです。

2+2は4、4+4は8、8+8は16という形でタイルの数字を大きくしていきながら、2048というタイルを作ることがゴールです。

【パズル攻略のストラテジー】
このパズルを少しさわってみると、すぐにコツのようなものがあることに気がつきます。それはたとえば、左上に大きな数字を集める方がよいとか、3方向にだけ動かして操作するほうがよいとか、そういった攻略テクニックです。このことをここではストラテジーと呼ぶことにします。

そのストラテジーをプログラミングすることで、このパズルをコンピュータが自動的に攻略し、最高で何枚のパネルを重ねられるかを競うことでよいストラテジーとは何かを比べてみることができます。

【パズルの攻略をプログラムする】
ハッカーズバーのお客様が、こんなストラテジーだとうまくいきそうだという話をされると、実際にそれをプログラミングして作ってみるといったことを繰り返していきながらよいストラテジーとは何かを探していきました。
パズル攻略のプログラミングをするとき、いま、パズルのタイルがどういった状態で、次の操作でタイルがどうなるかを、プログラミング上の配列に記録します。そしてその配列をある関数に通すことで、その配列が次のタイルの形を表す配列になるといった関数のプログラムを書いていくことになります。

*図の中のnullは何もないという意味。プログラミング言語などコンピュータ関係では、何も示さないものを指します。

私の場合、タイルの操作をするために4つの関数を作りました。それは上に動かす、右に動かす、左に動かす、下に動かすという4つの操作に対応するものです。

 

複雑に見えますが、プログラマーはこういった操作が得意です。
ぶつかった数字が同じだったら、それらを足し合わせるといったプログラムを書いていきます。左右の動きは数値が隣にならんでいるので簡単ですが、上下の動きとなると、数字が少し離れているのでちょっとわかりにくいです。
左右に動かすときは、「0, 1, 2, 3」「4, 5, 6, 7」・・・をそれぞれチェックしますが、
上下に動かすときは、「0, 4, 8, 12」「1, 5, 9, 13」・・・をチェックして足し合わせるといった具合です。そうして4つの関数をすべて作りました。

【もしも数学を知っていたら】
上では、左右の動きは簡単で、上下の動きは難しいという話をしましたが、数学で考えてみると、もっと単純な話であることに気がつきます。
4×4のマス目はx y座標を使って考えるとわかりやすいですね。
左へ動かすという一つの関数を作ることができれば、-90度回転して左へ動かして90度回転するという操作をすることで、上へ動かすという操作を実現することができるということに気がつきます。
数学がわかっていたら、回転行列を使って、行列の操作で回転をすることができますが、実は多くのプログラマーにとって回転という操作は苦手です。

【数学から入るか、現象からはいるか】
プログラミングは本来数学的なところから始まっているのは事実ですが、プログラミングに慣れ親しめば親しむほど、関数や分岐を使って現象を記述することが得意になり、数学的な要素は必ずしも必要なくなってしまっています。これがプログラマーが数学が得意であるとは限らない理由です。
ただ、数学を知ることで、プログラミングにおいても近道を見つけることは可能ですし、本当に最適化されたプログラムというのは数学的に裏付けされた形で記述されることが多いです。 また、最近では、行列計算に特化したGPU*を使うことで、画像処理や機械学習に必要な計算を効率的に実施することができるようになりました。

【数学は楽しい】
数学は、正解や道筋が1つではなく自由で、数学者たちと話すと毎回新しい発見を与えてくれます。
数学関係の友人に恵まれたことで、いくつかの数学のコミュニティに関わることができ、楽しい毎日を過ごせています。
皆さま今後ともよろしくお願いします。

2048ゲームにチャレンジしてみましょう!

* GPU: 画像処理に特化した演算装置。並列作業を効率よく処理することができる。

※2017年8月掲載。情報は記事執筆時に基づき、現在では異なる場合があります。

著者略歴

近藤 祥子
六本木にあるハッカーズバーというバーでハッカーをしています。プログラミングで課題を解決するのが好きで、あまり時と場所を選ばずにコーディングしています!

SNS Share Button