2021/11/13

ヒューマン・リソース・マシーン 入社23年目−一番小さいのは?

目次

1)課題

複数の「0区切り文字列」が置かれています。

各文字列の内から一番小さい数字を右側に運んで下さい。ただし、各文字列は少なくとも1つの数値を含むものとする。

2)大小の比較

この課題を解くためには, 2枚のパネルの大小を比較する方法が必要です. SUBコマンドとJUMP if negativeコマンドを組み合わせれば, パネルの大小を比較できます.

SUBコマンドを使うと, 持っているパネルからカーペットのパネルを引いた結果が得られます. 引いた結果がマイナス値であれば, 持っていたパネルがカーペットのパネルより小さいと言えます. 

3)一番小さいのは?

上司の要求は, 「一番小さい数字」です. 一番小さい数字を求めるために, 「チャンピオン」と「チャレンジャー」を用意します. 「チャレンジャー」を「チャンピオン」に挑ませ, 「チャレンジャー」が勝てば次の「チャンピオン」になり, 最後に「チャンピオン」であった者が真の「チャンピオン」です. この考え方を整理します.

  1. 「チャンピオン」と書いたカーペットには, 左のコンベアの先頭のパネルを置きます.「チャンピオン」と書いてありますが, あくまでも暫定王者です.
  2. 左のコンベアからパネルを取り出し, 「チャレンジャー」と書いたカーペットに置きます. 
  3. 「チャンピオン」と「チャレンジャー」のどちらが小さいかを比較します. 
  4. 「チャンピオン」の方が小さければ, そのまま左のコンベアから次の「チャレンジャー」を取り出し,比較します.
  5. 「チャレンジャー」の方が小さければ, 「チャレンジャー」が新しい「チャンピオン」になります.
  6. 0と書いたパネルを取り出せば, そこで終了です. 「チャンピオン」を右のコンベアに運びます.

少しずつ作っていきます. まずは, 大小を比較するところまでコードを書いてみました. 図のコードは, 「チャレンジャー」-「チャンピオン」を計算します. 

SUBコマンドに続けて, JUMP if negativeコマンドを入れました. SUBコマンドの結果がマイナス値であれば, 「チャンピオン」を交代させます. マイナス値でなければ, JUMPコマンドを使って次の「チャレンジャー」を呼び出します. 

図は, 左のコンベアから0と書いたパネルを取り出したところです. 0は「区切り文字」ですから「チャレンジャー」ではありません. 

4行目のJUMP if zeroコマンドにより, 0の場合は12行目にジャンプさせ, 「チャンピオン」を右のコンベアに運びます. 14行目のJUMPコマンドの先が画面に入っていませんが, 先頭に戻っています. 

サイズ目標とスピード目標まで, もう少しのようです. これらの目標を達成するためには, プログラムの読みやすさを犠牲にしなくてはなりません. 記事を改めて解説します.

目次

0 件のコメント:

コメントを投稿

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

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