本当に初心者の人に捧げるコンピューター入門


ソフトウェア プログラム編その2

大馬鹿者に噛んで含めて説明する

 前の章では人間にとっては当たり前で明白で説明以前のことでも、コンピューターは理解できないことを書きました。そこで当たり前のことをどうやったらコンピューターに分かる形で説明するかを考えなければなりません。

コンピューターに分かる説明とは?



 かなり気が重くなってきましたが、ともかく前章でコンピューターがわめいた以下のような質問に対して答えてやらなければなりません。

「道なりって何だ?」
「進むって何だ?」
「分かれ道って何だ?」
「左って何だ?」
「まっすぐって何だ?」
「行き止まりって何だ?」
「引き返すって何だ?」
「そもそも迷路ってなんだ?」

(1)迷路とはなんだ?

 まず最初のステップは迷路を数値で表すことです。これはどうすればいいのでしょう?
 よく見るとこの迷路は15×15のマス目で構成されています。各マスが道か壁であるということに気がつけば、要するにこの迷路は下のような「絵」と同じようなものなのです(の位置があなたの放り込まれた場所です)前に画像データをビットマップという方法で表しましたね。迷路もこんなやり方で表現できそうです。




 下は道が0、壁が1だという規則を作って迷路を数値に直したものです。コンピューターのメモリーの適当なところ(この例では0番地から)その値を書き込んでおきます。

迷路を表すデータの表
番地01234567891011121314
値 111111111111101
番地151617181920212223242526272829
値 100010000010001
番地303132333435363738394041424344
値 101000111011101
番地454647484950515253545556575859
値 101111101010001
番地606162636465666768697071727374
値 100010000010111
番地757677787980818283848586878889
値 101010111110001
番地90919293949596979899100101102103104
値 111010100010101
番地105106107108109110111112113114115116117118119
値 100010001000101
番地120121122123124125126127128129130131132133134
値 111011111111101
番地135136137138139140141142143144145146147148149
値 100000000010101
番地150151152153154155156157158159160161162163164
値 101111111010101
番地165166167168169170171172173174175176177178179
値 100001000010001
番地180181182183184185186187188189190191192193194
値 111111011111111
番地195196197198199200201202203204205206207208209
値 100000000000001
番地210211212213214215216217218219220221222223224
値 111111111111111


 これで迷路の各地点がメモリーのアドレスに対応し、そこが道なのか壁なのかは中身を読んでやれば分かるわけです。

 こうしておくと、現在の場所とは現在いる場所の番地であるということが分かります。
 今あなたは左下の196番地の地点にいて、出口は13番地の地点であるということが分かります。
 今回の問題は上のようなデータが与えられたときに、196番地の位置から値が0の場所だけを通って13番地に行くことだと表現できます。


(2)道なりとは?

 さてではまずあなたがしなければならないのは、道なりに進んでいくことです。道なりに進むというのはよく使われる概念ですが、これを詳しく説明するのは意外に面倒なことに気がつくでしょう。
 とりあえず道なりに進むという言葉を厳密に言うと、

今の場所が普通の道(分かれ道でも行き止まりでもない)の場合に来た方向ではない方向に存在している道の方向に進む

となりますが・・・この説明にも「分かれ道」だの「行き止まり」だの「来た方向」だのというよく分からない言葉が混じっています。ここまでの説明では厳密これらの言葉の説明をすることがまだできません。そういう場合はとりあえず置いておくのが正解です((10)で説明します)

(3)方向とは?まっすぐとは?

 まずは一番基本的な方向という概念をどうにかしましょう。
 これは簡単です。現在向いている方角と考えればいいですね。この迷路では直角方向にしか道はないので、東西南北の4つの方角だけを考えればいいわけです。
 しかしもちろんコンピューターは方角を表す東西南北なんて言葉は分かりません。でも方角を角度で表せば数値になります。そこで北:0 東:90 南:180 西:270 という値で表せばいいわけです(エアコンバットが好きなら別に3、6、9、12とかやっても構いません)

 これを使えば自分が今どちらを向いているかということも数値で表せるのは分かるでしょう。
 そしてまっすぐとは今向いている方向のことを表しているわけです。

(4)来た方向とは

 来た方向とは要するに後ろ側のことですね。後ろとは現在向いている方向と180度反対の方向のことです。そこで以下のような表を作っておけば、どちらを向いていても来た方向が分かります。

 0度を向いているときは180度の方向である 
 90度を向いているときは270度の方向である 
 180度を向いているときは0度の方向である 
 270度を向いているときは90度の方向である 

※ こういう表を作る代わりに、下のような計算を行っても同じですね。
  1. 現在の方向に180を足す
  2. もし足した結果が360を越えていたら、360を引く

(5)進むとは

 進むとは、現在の場所から東西南北いずれかの方角に一つ動くことです。
 では動くとはどういうことでしょう。迷路のデータをよく見てください。例えば110番地の位置から北に一歩進んだ場所の番地は95番地です(セルが黄色くなってます)すなわち

 0度の方向(北)に進む=現在地を現在の番地から15を引いた番地にすること 

といえることが分かります。同様にして

 90度の方向(東)に進む=現在の番地に1を足した番地 
 180度の方向(南)に進む=現在の番地に15を足した番地 
 270度の方向(西)に進む=現在の番地から1を引いた番地 

ということも分かるでしょう。これで東西南北の方向に一歩進むことができるようになりました。
 ですから、まっすぐに進むというのは現在向いている方角に一つ進むということを表します。

(6)分かれ道・行き止まりとは

 では分かれ道とはどういう所でしょう?。これは以下のように言うことができるのが分かります。

 分かれ道とは3方向以上が道である場所である 

同様に行き止まりとは

 行き止まりとは1方向しか道のない場所である 

 ここで問題になるのは、どうやって周囲の道の数を数えるかということです。もちろんコンピュータに周りを数えろと言っても理解できません。そこでやっぱり数え方を教えてやらなければなりません。


(7)道の数の数え方は

 普通歩いていて分かれ道の数を数えるときはどうするでしょう?当たり前ですが、分かれ道の真ん中に立って、どれか一つから始めてぐるっと回りながら数えていきます。具体的には次のような感じで数えるのではないでしょうか?

 まず前に道がある。これで一個・・・右を見たら道がある。今一個あったからこれで二つ・・・後ろにも道がある。今二個だからこれで三つ・・・左には道がないから、ここの分かれ道の数は三つだ!

 こんなことを本当に思いながら数える人はいないでしょうが、頭の中ではこういうことが起こっているのだと理解はできるでしょう。
 このやり方をコンピューター式に書いてみると大体下のような感じになるでしょうか。

  1. どこでもいいから適当な空いたメモリーを一つ用意して(例えば250番地)とりあえず0を書き込んでおく(あなたはさっき考えたとき、今いくつまで数えたか覚えていたはずですね。ここはそれを覚えておく場所です)
  2. 北(0度)に隣接している地点が道(値が0)だったら250番地の値を読んで、読んだ値に1を足して再び250番地に書き込む。
  3. さらに、東(90度)に隣接している地点が道だったら同様に250番地の値に1を足す。
  4. さらに、南(180度)に隣接している地点が道だったら同様に250番地の値に1を足す。
  5. さらに、西(270度)に隣接している地点が道だったら同様に250番地の値に1を足す。
こうするとどうなるでしょう?例えばその場所が北、南、西に分岐している所だったとします。すると、

  1. 250番地に0を書く
  2. 北には道があるので250番地の中身(今は0)に1を足して250番地に書き込みます。こうすると250番地の中身は1になります。
  3. 東には道がないのでなにもしません
  4. 南には道があるので250番地の中身(今は1)に1を足して250番地に書き込むと、250番地の中身は2になります。
  5. 西にも道があるので250番地の中身(今は2)に1を足して250番地に書き込むと、250番地の中身は3になります。
 こうすれば250番地の中身がその場所で分岐する道の数になるわけです。
 というわけでやっと数が数えられました・・・

(8)左とは

 左というのは(4)の来た方向(後ろ)とほとんど同じように定義できることがわかるでしょう。

 0度を向いているときは270度の方向である 
 90度を向いているときは0度の方向である 
 180度を向いているときは90度の方向である 
 270度を向いているときは180度の方向である 

という表を作るか、

  1. 現在の方向に270を足す。
  2. 結果が360以上になったら360を引く。
という方法です。

(9)引き返すとは

 引き返すとはどういう動作かというと、現在の向きと180度反対の方向を向いて歩き出すことです。これを更に細かく言うと、

  1. 反対を向いて
  2. 前に一歩進む
ことです。
 これは(4)と(5)で両方ともやりましたね。


(10)道なりに進むとは

 道なりとは分かりやすいようでこの中では一番面倒くさい概念でした。しかしここまで読んでもらえば説明できます。
 まず「道なりに行ける」ためには、分かれ道がないという前提が必要ですね。分かれ道があったらどっちに行っていいか分かりません。すなわち、道なりとは「分かれ道がない場合」は「その道づたい」にずっと進んでいくことです。
 今度は「その道づたい」という言葉が出てきました。これはどういう意味でしょうか?
 曲がっていない道なら単にこれはまっすぐに進むと言うことです。しかし道は曲がっていることもあります。そこで次に書くようなチェックをしなければなりません。

  • 前提としてここが分かれ道でも行き止まりでもないというのが必要。すなわち、周囲の道の数を数える((7)を参照)とその結果が2になっている場所でないといけない。
  1. 現在向いている方向と反対の方向を求めておく((4)を参照)
  2. 現在の場所に0度の方向に道があって、それが反対の方向でなければ答えは0度。
  3. 現在の場所に90度の方向に道があって、それが反対の方向でなければ答えは90度。
  4. 現在の場所に180度の方向に道があって、それが反対の方向でなければ答えは180度。
  5. 現在の場所に270度の方向に道があって、それが反対の方向でなければ答えは270度。
  6. 得られた答えの方向に向き直す。
  7. その方向に一歩進む。
 コンピューターに「道なりに進む」ということを説明するにはここまで言ってやらなければならないのです。バカですね。

やっとできあがる



 というように、とりあえず何とか細かい言葉の定義ができました。これを考慮してアルゴリズムを書いてみると以下のようになります。

  1. 迷路の情報を0番地以降に書き込んでおく((1)参照)

  2. 適当な空いた場所(例えば230番地)の中身を現在いる場所とする。
  3. 最初はスタート地点(196番地)にいるので、230番地に196と書き込む。
  4. 適当な空いた別の場所(例えば231番地)の中身を現在向いている方向とする。
  5. 最初は東(90度)の方向を向いているので231番地に90と書き込む。

  6. 現在の場所が出口かどうか調べる(=230番地の中身を見る)
  7. ここが出口だった(=現在位置が13番地だった)場合は出口に行き着いたので終わり。
  8. ここが出口でない(=現在位置が13番地でない)場合は、(7)の手順で現在位置から分岐する道の数を数えて、数えた結果を適当な場所(例えば250番地)に書き込む。

      250番地の中身が3または4だった場合(=ここは分かれ道)
        左に道があれば((8)参照)左を向き一歩進む((5)参照)
        左に道がなければ前(今向いている方向に)に一歩進む

      250番地の中身が、2だった場合(=ここは普通の道)
        道なりの方向を求めて((10)参照)その方向に一歩進む。

      250番地の中身が、1だった場合(=ここは行き止まり)
        180度向きを変えて、前に一歩進む。

  9. 6.に戻って再び現在の場所を調べる・・・

なんだかひどく疲れた・・・



 どうです?疲れました?当然です。どう見たって普通の人の常識とはかなりかけ離れた世界です。でもコンピューターのアルゴリズムを作るということは、実はこういうことなんです。
(私は全然疲れてないぞ!という人は
こちらをどうぞ)

 それはともかくとして、ここではまだアルゴリズムができただけです。これを実際にコンピューターが理解できる言語で表現しなければなりません。
 次の章ではコンピューター言語という物に関して説明します。


前へ 目次へ 次へ