2021/10/26

ヒューマン・リソース・マシーン 入社16年目−必ずポジティブに

目次

課題

左側のコンベアの数値を右側に運んで下さい。
ただし、その数値がマイナス値である場合は、マイナスマークを外してから右側に運んで下さい。

解説

この課題から, 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

マイナスマークを外す手順を考えてみます.

  1. 左のコンベアからパネルを取り, カーペット0番に置きます. 
  2. パネルがマイナス値であれば, 持っているパネルからカーペット0番のパネルを2回引きます. 結果を右のコンベアに運び, 最初に戻ります.
  3. パネルがマイナス値ではない, つまり, プラス値であれば, そのまま右のコンベアに運び, 最初に戻ります.

手順を素直にコードに置き換えました. このコードを実行すると課題をクリアーできます.

サイズ目標もスピード目標も達成できませんでした. これらの目標を達成するためのコードの最適化については, 記事を改めて解説します. 

目次

0 件のコメント:

コメントを投稿

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

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