1)課題
複数の「0区切り文字列」が置かれています。
各文字列の内から一番小さい数字を右側に運んで下さい。ただし、各文字列は少なくとも1つの数値を含むものとする。
2)大小の比較
この課題を解くためには, 2枚のパネルの大小を比較する方法が必要です. SUBコマンドとJUMP if negativeコマンドを組み合わせれば, パネルの大小を比較できます.
SUBコマンドを使うと, 持っているパネルからカーペットのパネルを引いた結果が得られます. 引いた結果がマイナス値であれば, 持っていたパネルがカーペットのパネルより小さいと言えます.
3)一番小さいのは?
上司の要求は, 「一番小さい数字」です. 一番小さい数字を求めるために, 「チャンピオン」と「チャレンジャー」を用意します. 「チャレンジャー」を「チャンピオン」に挑ませ, 「チャレンジャー」が勝てば次の「チャンピオン」になり, 最後に「チャンピオン」であった者が真の「チャンピオン」です. この考え方を整理します.
- 「チャンピオン」と書いたカーペットには, 左のコンベアの先頭のパネルを置きます.「チャンピオン」と書いてありますが, あくまでも暫定王者です.
- 左のコンベアからパネルを取り出し, 「チャレンジャー」と書いたカーペットに置きます.
- 「チャンピオン」と「チャレンジャー」のどちらが小さいかを比較します.
- 「チャンピオン」の方が小さければ, そのまま左のコンベアから次の「チャレンジャー」を取り出し,比較します.
- 「チャレンジャー」の方が小さければ, 「チャレンジャー」が新しい「チャンピオン」になります.
- 0と書いたパネルを取り出せば, そこで終了です. 「チャンピオン」を右のコンベアに運びます.
少しずつ作っていきます. まずは, 大小を比較するところまでコードを書いてみました. 図のコードは, 「チャレンジャー」-「チャンピオン」を計算します.
SUBコマンドに続けて, JUMP if negativeコマンドを入れました. SUBコマンドの結果がマイナス値であれば, 「チャンピオン」を交代させます. マイナス値でなければ, JUMPコマンドを使って次の「チャレンジャー」を呼び出します.
図は, 左のコンベアから0と書いたパネルを取り出したところです. 0は「区切り文字」ですから「チャレンジャー」ではありません.
4行目のJUMP if zeroコマンドにより, 0の場合は12行目にジャンプさせ, 「チャンピオン」を右のコンベアに運びます. 14行目のJUMPコマンドの先が画面に入っていませんが, 先頭に戻っています.
サイズ目標とスピード目標まで, もう少しのようです. これらの目標を達成するためには, プログラムの読みやすさを犠牲にしなくてはなりません. 記事を改めて解説します.
0 件のコメント:
コメントを投稿