1)課題
左側の各数値を0までカウントダウン、もしくはカウントアップした結果を右側に運んでください。
[bump+][bump-]コマンドが使えるようになりました。カーペット上の指定の場所に置いてある数字を+1もしくは-1して、その数値をコピーして手元に保持します。
2)BUMPコマンドの使い方
まず, BUMPコマンドの使い方を確認します.
BUMPコマンドの動作を調べるために, 簡単なコードを作成しました. 左のコンベアからパネルを取り, カーペットの0番に配置し, そのまま右のコンベアに運びます. パネルを持たずにBUMPコマンドを実行して, 動作を確認します.
ステップ実行により, OUTBOXコマンドまで実行しました. これからBUMP+コマンドを実行します.
BUMP+コマンドを1回, 実行しました. カーペット0番のパネルが2から3に変わり, カーペットのパネルのコピーを持っています.
2つ目のBUMP+コマンドを実行しました. パネルの値が4になっています.
BUMP-コマンドを2回実行しました. パネルの値が2になっています.
BUMP+コマンドは, カーペットに置いてあるパネルを1増やし, 値を増やしたパネルのコピーを持ちます. BUMP-コマンドは, カーペットのパネルを1減らします.
3)課題を解く
BUMPコマンドの使い方を理解できましたが, 問題文だけでは上司が何を求めているのか分かりませんでした. 上司に解答例を尋ねてみました.
解答例から, パネルが3なら, 3, 2, 1, 0を右のコンベアに運び, パネルが-2なら, ―2, ―1, 0を右のコンベアに運べば良さそうです. つまり, BUMPコマンドを使ってパネルの値を1ずつ0に近づけ, その都度, 右のコンベアに運べば, 上司の要求に応えられます.
まず, パネルの値がプラスの場合に限定して, コードを書くために必要な事柄を挙げていきます.
- パネルの値が0でなければ, BUMP-コマンドを使ってパネルの値を1つ減らします.
- パネルの値が0であれば, 右のコンベアに運びます. 処理しているパネルについては, これで終了です.
- パネルの値が0でなければ, 最初に戻ります.
- BUMP-コマンドを使ってパネルの値を1つ減らすごとに, 右のコンベアに運ばなくてはなりません.
- OUTBOXコマンドを使うと持っているパネルが無くなりますので, COPYTOコマンドを使って持っているパネルをカーペットに退避しておきます.
- 解答例を見ると, 左のコンベアから取った時のパネルと0を右のコンベアに運ばなくてはなりません. このような境界値を忘れがちなので注意が必要です.
考えた結果をコードに変換しました.
そのまま実行しました. 左のコンベアの1枚目のパネルが2でしたので, 2, 1, 0を右のコンベアに運んでいますので, 期待した結果が得られました. 2枚目のパネル,―2については何も対策をしていませんので, 誤ったパネルを右のコンベアに運んでしまい, 上司に怒られてしまいました.
左のコンベアから取ったパネルがマイナス値の場合とプラス値の場合とで処理を分けていきます. コードを眺めると, JUMP if zeroコマンドの後でマイナス値かプラス値かで処理を分けるのが良さそうです. JUMP if negativeコマンドを使ってBUMP-コマンドとBUMP+コマンドを使い分けます. このコードを実行すると課題をクリアーできます.
サイズ目標を達成できました. スピード目標を達成するには, かなり工夫が必要です.
0 件のコメント:
コメントを投稿