ソフトウェア プログラム編その2 大馬鹿者に噛んで含めて説明する | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
前の章では人間にとっては当たり前で明白で説明以前のことでも、コンピューターは理解できないことを書きました。そこで当たり前のことをどうやったらコンピューターに分かる形で説明するかを考えなければなりません。コンピューターに分かる説明とは?かなり気が重くなってきましたが、ともかく前章でコンピューターがわめいた以下のような質問に対して答えてやらなければなりません。 「道なりって何だ?」 「進むって何だ?」 「分かれ道って何だ?」 「左って何だ?」 「まっすぐって何だ?」 「行き止まりって何だ?」 「引き返すって何だ?」 「そもそも迷路ってなんだ?」 (1)迷路とはなんだ?まず最初のステップは迷路を数値で表すことです。これはどうすればいいのでしょう?よく見るとこの迷路は15×15のマス目で構成されています。各マスが道か壁であるということに気がつけば、要するにこの迷路は下のような「絵」と同じようなものなのです(●の位置があなたの放り込まれた場所です)前に画像データをビットマップという方法で表しましたね。迷路もこんなやり方で表現できそうです。
これで迷路の各地点がメモリーのアドレスに対応し、そこが道なのか壁なのかは中身を読んでやれば分かるわけです。 こうしておくと、現在の場所とは現在いる場所の番地であるということが分かります。 今あなたは左下の196番地の地点にいて、出口は13番地の地点であるということが分かります。 今回の問題は上のようなデータが与えられたときに、196番地の位置から値が0の場所だけを通って13番地に行くことだと表現できます。 (2)道なりとは?さてではまずあなたがしなければならないのは、道なりに進んでいくことです。道なりに進むというのはよく使われる概念ですが、これを詳しく説明するのは意外に面倒なことに気がつくでしょう。とりあえず道なりに進むという言葉を厳密に言うと、
となりますが・・・この説明にも「分かれ道」だの「行き止まり」だの「来た方向」だのというよく分からない言葉が混じっています。ここまでの説明では厳密これらの言葉の説明をすることがまだできません。そういう場合はとりあえず置いておくのが正解です((10)で説明します) (3)方向とは?まっすぐとは?まずは一番基本的な方向という概念をどうにかしましょう。これは簡単です。現在向いている方角と考えればいいですね。この迷路では直角方向にしか道はないので、東西南北の4つの方角だけを考えればいいわけです。 しかしもちろんコンピューターは方角を表す東西南北なんて言葉は分かりません。でも方角を角度で表せば数値になります。そこで北:0 東:90 南:180 西:270 という値で表せばいいわけです(エアコンバットが好きなら別に3、6、9、12とかやっても構いません) これを使えば自分が今どちらを向いているかということも数値で表せるのは分かるでしょう。 そしてまっすぐとは今向いている方向のことを表しているわけです。 (4)来た方向とは来た方向とは要するに後ろ側のことですね。後ろとは現在向いている方向と180度反対の方向のことです。そこで以下のような表を作っておけば、どちらを向いていても来た方向が分かります。
※ こういう表を作る代わりに、下のような計算を行っても同じですね。
(5)進むとは進むとは、現在の場所から東西南北いずれかの方角に一つ動くことです。では動くとはどういうことでしょう。迷路のデータをよく見てください。例えば110番地の位置から北に一歩進んだ場所の番地は95番地です(セルが黄色くなってます)すなわち
といえることが分かります。同様にして
ということも分かるでしょう。これで東西南北の方向に一歩進むことができるようになりました。 ですから、まっすぐに進むというのは現在向いている方角に一つ進むということを表します。 (6)分かれ道・行き止まりとはでは分かれ道とはどういう所でしょう?。これは以下のように言うことができるのが分かります。
同様に行き止まりとは
ここで問題になるのは、どうやって周囲の道の数を数えるかということです。もちろんコンピュータに周りを数えろと言っても理解できません。そこでやっぱり数え方を教えてやらなければなりません。 (7)道の数の数え方は普通歩いていて分かれ道の数を数えるときはどうするでしょう?当たり前ですが、分かれ道の真ん中に立って、どれか一つから始めてぐるっと回りながら数えていきます。具体的には次のような感じで数えるのではないでしょうか?まず前に道がある。これで一個・・・右を見たら道がある。今一個あったからこれで二つ・・・後ろにも道がある。今二個だからこれで三つ・・・左には道がないから、ここの分かれ道の数は三つだ! こんなことを本当に思いながら数える人はいないでしょうが、頭の中ではこういうことが起こっているのだと理解はできるでしょう。 このやり方をコンピューター式に書いてみると大体下のような感じになるでしょうか。
というわけでやっと数が数えられました・・・ (8)左とは左というのは(4)の来た方向(後ろ)とほとんど同じように定義できることがわかるでしょう。
という表を作るか、
(9)引き返すとは引き返すとはどういう動作かというと、現在の向きと180度反対の方向を向いて歩き出すことです。これを更に細かく言うと、
これは(4)と(5)で両方ともやりましたね。 (10)道なりに進むとは道なりとは分かりやすいようでこの中では一番面倒くさい概念でした。しかしここまで読んでもらえば説明できます。まず「道なりに行ける」ためには、分かれ道がないという前提が必要ですね。分かれ道があったらどっちに行っていいか分かりません。すなわち、道なりとは「分かれ道がない場合」は「その道づたい」にずっと進んでいくことです。 今度は「その道づたい」という言葉が出てきました。これはどういう意味でしょうか? 曲がっていない道なら単にこれはまっすぐに進むと言うことです。しかし道は曲がっていることもあります。そこで次に書くようなチェックをしなければなりません。
やっとできあがるというように、とりあえず何とか細かい言葉の定義ができました。これを考慮してアルゴリズムを書いてみると以下のようになります。
なんだかひどく疲れた・・・どうです?疲れました?当然です。どう見たって普通の人の常識とはかなりかけ離れた世界です。でもコンピューターのアルゴリズムを作るということは、実はこういうことなんです。 (私は全然疲れてないぞ!という人はこちらをどうぞ) それはともかくとして、ここではまだアルゴリズムができただけです。これを実際にコンピューターが理解できる言語で表現しなければなりません。 次の章ではコンピューター言語という物に関して説明します。 |