1)課題
左側のコンベアに2つの単語が運ばれてきます。辞書順で並べたときに、先に来る単語を右側に運んで下さい。
2)考え方
単語を辞書順に並べるのですから, 1文字ずつ比較していきます. 異なる文字が現れれば, 並び順の小さい文字を含む単語を右のコンベアに運びます. 注意点として, 2つの単語の文字数が異なる場合, 短い方の単語を運びます.
プログラムは大きく3つの部分から構成します.
- 左のコンベアからパネルを取り出し, カーペットに配置する.
- カーペットに配置した2つの単語を構成する文字を1文字ずつ比較し, 先に来る単語を特定する.
- 先に来る単語を右のコンベアに運ぶ.
プログラムを作るために, いくつか名前を決めていきます.
- 左のコンベアから取り出した1つ目の単語をAとします.
- 2つ目の単語をBとします.
- 単語Aのアドレスを記録するカーペットをADR-Aとします.
- 同様に単語BのアドレスをADR-Bとします.
- 最後に右のコンベアに単語を運ぶためのアドレスをOUTとします.
3)実装
プログラムを作っていきます.
カーペットに名前を付け, 左のコンベアから運び出したパネルをカーペットに配置します. カーペットの23番に0, 24番に10と書いたパネルがあります. 単語Aを配置し始めるカーペットの番号に0を割り当て, 単語Bは10を割り当てます.
15行目から, ADR-AとADR-Bを再初期化し, 1文字ずつの比較に備えます.
続けて, 単語Aと単語Bが終端を表す0に到達しているか調べ, 0になっている単語を運び出します. 運び出す単語のアドレスをOUTに設定しています. OUTを使って単語を運び出せますので, 運び出す処理を1つにまとめられます.
23行目から1文字ずつ比較するコードを書いていきます. 23行目に到達した時点で単語Bの文字を持っていますので, 単語Aの文字とSUBコマンドを使って比較します.
結果が0なら同じ文字ですので, 次の文字を比較するためにADR-AとADR-Bを1増やし, 19行目に戻ります.
結果が0でなくマイナスの場合, 単語Aの文字の方が大きいということですから, 単語Bを運ぶためにカーペット24番の10運ぶ準備をします.
結果がプラスの場合, 単語Aを運ぶためにカーペット23番の0をOUTに運ぶ準備をします.
OUTを使ってカーペットに置いてあるパネルを運び出します. OUTが示すカーペットのパネルが0になるまで, 右のコンベアに運び, OUTを1増やす操作を繰り返します.
クリアーできました. サイズ目標を達成できています. スピード目標はもう少しで達成できます.
0 件のコメント:
コメントを投稿