2021/12/14

ヒューマン・リソース・マシーン 入社36年目−辞書順に並べよ

1)課題

左側のコンベアに2つの単語が運ばれてきます。辞書順で並べたときに、先に来る単語を右側に運んで下さい。

2)考え方

単語を辞書順に並べるのですから, 1文字ずつ比較していきます. 異なる文字が現れれば, 並び順の小さい文字を含む単語を右のコンベアに運びます. 注意点として, 2つの単語の文字数が異なる場合, 短い方の単語を運びます. 

プログラムは大きく3つの部分から構成します.

  1. 左のコンベアからパネルを取り出し, カーペットに配置する.
  2. カーペットに配置した2つの単語を構成する文字を1文字ずつ比較し, 先に来る単語を特定する.
  3. 先に来る単語を右のコンベアに運ぶ.

プログラムを作るために, いくつか名前を決めていきます. 

  1. 左のコンベアから取り出した1つ目の単語をAとします. 
  2. 2つ目の単語をBとします. 
  3. 単語Aのアドレスを記録するカーペットをADR-Aとします.
  4. 同様に単語BのアドレスをADR-Bとします.
  5. 最後に右のコンベアに単語を運ぶためのアドレスを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 件のコメント:

コメントを投稿

ヒューマン・リソース・マシーン 入社41年目−並べ替えよ

目次 1)課題 0を終端とした文字列がいくつか流れてきます。各文字列に対してソート(並べ替え)を行い、小さい順(昇順)に右側へ運んでください。 2)状況の確認 この問題では, 予めコードが入っています. このコードを実行して, 何をするコードなのか確かめます.  左のコンベアから...