課題
左側のコンベアの数値を右側に運んで下さい。ただし、その数値がマイナス値である場合は、マイナスマークを外してから右側に運んで下さい。
解説
この課題から, JUMP if negativeコマンドを使えるようになりました. JUMP if zeroコマンドは, 持っているパネルが0の時, 矢印の先に進みました. JUMP if negativeコマンドは, 持っているパネルがマイナス値の時, つまり0よりも小さい時, 矢印の先に進みます. つまり, JUMP if negativeコマンドを使えば, パネルの値がマイナス値であるか判定できます.
パネルからマイナスマークを外す方法, つまり, 絶対値を求める方法を考えます. もし, 掛け算が使えるのであれば, -1を掛ければマイナスマークを外せます. しかし, ヒューマン・リソース・マシーンの世界には掛け算はありません. 別の方法が必要です.
少し考えると, 引き算を2回使えば, マイナスマークを外せることに気づきました. パネルの値が-8の時, 次のように計算をすれば, -8から8を得られます.
―8―(―8)―(―8)=―8+8+8=8
マイナスマークを外す手順を考えてみます.
- 左のコンベアからパネルを取り, カーペット0番に置きます.
- パネルがマイナス値であれば, 持っているパネルからカーペット0番のパネルを2回引きます. 結果を右のコンベアに運び, 最初に戻ります.
- パネルがマイナス値ではない, つまり, プラス値であれば, そのまま右のコンベアに運び, 最初に戻ります.
手順を素直にコードに置き換えました. このコードを実行すると課題をクリアーできます.
サイズ目標もスピード目標も達成できませんでした. これらの目標を達成するためのコードの最適化については, 記事を改めて解説します.
0 件のコメント:
コメントを投稿