2021/10/23

ヒューマン・リソース・マシーン 入社14年目−大は小を兼ねる

目次

課題

左側の数値2つごとに数字の大小を比較し大きい方の数値を右側に運んで下さい。もし数値が同じである場合、いずれかを運んで下さい。
[JUMP if negative]が使えるようになりました。手元の値がマイナスの時だけ指定ジャンプ先に移動します。

解説

入社13年目では, 2枚のパネルが同じ値かを判定しました. この問題では, 値が大きい方のパネルを選びます. この問題でも同じようにSUBコマンドを使います.

SUBコマンドは, 持っているパネルの値から, カーペットに置いてあるパネルの値を引きます. つまり, SUBコマンドの結果がマイナスになれば, カーペットに置いてあるパネルの方が大きいと言えます.

アルゴリズムを考えると次のようになります.

  1. 1枚目のパネルを取りだし, カーペットの0番に置く.
  2. 2枚目のパネルを取りだし, カーペットの1番に置く.
  3. 持っているパネルとカーペット0番のパネルで減算をする. この時, 持っているパネルはカーペット1番の同じ値であることに注意.
  4. 減算の結果がマイナスであれば, カーペット0番のパネルの方が大きいので, カーペット0番のパネルを右のコンベアに運び, 最初に戻る.
  5. 減算の結果がマイナスでなければ, カーペット1番のパネルを右のコンベアに運び, 最初に戻る.

このアルゴリズムからコードを組み立てました. このコードを実行すると課題をクリアーできます.

クリアーはできましたが, サイズ目標もスピード目標も達成できませんでした. 2回使っているOUTBOXコマンドを1回にまとめられれば, サイズ目標を達成できそうです. コードの最適化については記事を改めます.

目次

0 件のコメント:

コメントを投稿

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

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