2021/10/19

ヒューマン・リソース・マシーン 入社13年目−同じかどうか

目次

1)課題

左側の数値2つごとに、同値か否か判断をして下さい。同値である場合、その値を1つ右側に運んで下さい。同値でない場合は、捨てちゃってください。
コメント機能が使えるようになりました。コマンドの合間にコメント機能でメモをつけて考えを整理しましょう。

2)解説

2枚のパネルの値が同じであるかどうかを判定する方法を考えます. 11年目でSUBコマンドの使い方を学びました. 2枚のパネルで引き算をして結果が0であれば, 持っているパネルとカーペットのパネルが同じ, と言えます. 

SUBコマンドを使うためには, パネルをカーペットに置く必要がありますので, 2枚のパネルが同値かどうかを判定する手順は次のようになります. 

  1. 1枚目のパネルを取りだし, カーペットに置く.
  2. 2枚目のパネルを取りだし, カーペットに置いたパネルと減算をする. 
  3. 減算の結果が0であれば, カーペットのパネルを取り, 右のコンベアに運ぶ.
  4. 減算の結果が0でなければ, 最初に戻る.

図は, この手順をコードにした結果です. このコードを実行すると, 課題をクリアーできます.

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

目次

2021/10/16

ヒューマン・リソース・マシーン 入社12年目−40の作り方

1)課題

左側の数値を40倍にして右側に運んで下さい。

2)解説

上司の言葉にもあるように, 入社8年目と10年目の成果を活用します. 

  1. 入社8年目では, 左側の数値を3倍にしました.
  2. 入社10 年目では, 左側の数値を8倍にしました. 

これらを活用して40倍にする方法を考えます. 8に5を掛ければ40になりますから, パネルの数値を8倍にし, その結果を5倍にすれば40倍となります. 

3行目から9行目までは, 入社10年目と同じようにして数値を8倍にしています. 10行目から13行目までは, 入社8年目と同じようにして数値を5倍にしています. 2行目で, カーペットの1番に左側のコンベアから取り出したパネルのコピーを置いています. これにより, 実行結果を検証できるようにしています. 

プログラムを実行した結果, 5の40倍となる200を作れました.

これまでの課題と同じようにして, OUTBOXコマンドとJUMPコマンドを追加してプログラムを完成させます. 

実行した結果, サイズ目標とスピード目標の両方を達成できました.

目次

2021/10/14

ヒューマン・リソース・マシーン 入社11年目−引き算の結果

課題

左側のパネル2つごと(A, B)に、2つのパネルを右側に運んで下さい。その際、1つめは(B-A)、2つめが(A-B)になるように運んで下さい。
[SUB]コマンドが使用可能になりました。手元のデータから、カーペット上の指定した番号に置かれたデータを減算します。

解説

ADDコマンドの対となるSUBコマンドの使い方を学ぶ問題です. 

ADDコマンドの場合, コマンドの解釈として次の2つのどちらを取ってもコマンドの実行結果は同じです.

  1. 持っているパネルにカーペットのパネルを加える.
  2. カーペットのパネルに持っているパネルを加える.

一方, SUBコマンドの場合, コマンドの解釈によって結果は異なります.

  1. 持っているパネルからカーペットのパネルを引く.
  2. カーペットのパネルから持っているパネルを引く.

SUBコマンドの動作を確認するために, コマンドを並べました. コードを実行すると, 次のようになります.

  1. カーペットの0番に3を置きます.
  2. カーペットの1番に8を置きます. この時, 8と書いたパネルを持っています.
  3. SUBコマンドを実行します. カーペット0番の3と持っている8とで引き算をします.

SUBコマンドを実行しました. 持っているパネルが8から5に変わりましたので, SUBコマンドは, 持っているパネル8からカーペットのパネル3を引いています. この結果は, 問題文のB-Aに対応します. この結果を右のコンベアに運べば, 上司からの要求の半分に応えられます. 

同様にして, A-Bも計算できます. 考え方は次の通りです.

  1. カーペットの0番はAに相当し, カーペットの1番はBに相当します.
  2. A-Bの結果が必要ですから, Aに相当するカーペット0番のパネルを持ち, SUBコマンドでカーペット1番を指定すれば, A-Bを計算します.
  3. OUTBOXコマンドで, 引き算した結果を右のコンベアに運びます.
このコードを実行すれば, 課題をクリアーできます.

サイズ目標もスピード目標も達成できました.

まとめ

  1. この課題では, SUBコマンドを使って持っているパネルからカーペットのパネルを引く方法を確認しました. (持っているパネル-カーペットのパネル)であり, 逆ではないことに注意が必要です.
  2. 減算した結果は持っているパネルに反映されます.
  3. パネルを持たずにSUBコマンドを実行するとエラーとなります. 逆にカーペットにパネルを置かずにSUBコマンドを実行してもエラーとなります. エラーとなると, 上司に怒られます.

目次

2021/10/12

ヒューマン・リソース・マシーン 入社10年目−3回で8を

1)課題

左側の数値を8倍にして右側に運んでください。

[ADD]をたくさん使えば、課題自体は簡単ですが、効率が悪いです。[ADD]の使用回数は3回でいけるハズです。考えてみましょう。

2)解説

ADDコマンドを7回使えば数値を8倍にできますが, 問題文にある通り効率が良くありません. 問題文には, ADDコマンドの使用回数は3回で良い, と書いてあります. 勘の良い人であれば, 2の3乗は8になることに気づくと思います. ヒューマン・リソース・マシーンのコマンドを組み合わせて, 8倍にする方法を探してみます.

左側のコンベアからパネルを取り, カーペットの0番と1番に置きます. 続けて, カーペットの1番に対してADDコマンドを実行し, その結果をカーペットの1番に置きます. カーペットの0番にパネルを置いた理由は, パネルの初期値を保存しておけば, 動作の確認がしやすくなるからです. このコードを実行することで, 左側のコンベアから取り出したパネルを2倍にできました. これを続けます.

ADDコマンドとCOPYTOコマンドを追加しました. これにより, 7を4倍した28になりました. 

この組み合わせをもう一つ追加すれば, 8倍にできます. ここまでできれば, もう少しでプログラムが仕上がります.

課題をクリアーするために, OUTBOXコマンドで持っているパネルを右側のコンベアに運び, JUMPコマンドで先頭に戻るようにしました. 

サイズ目標とスピード目標を達成できていません. 無駄なコマンドを取り除き, プログラムを最適化します. 2行目と9行目のCOPYTOコマンドは, 説明のために入れたコマンドですので, 取り除いてもプログラムの実行結果に影響を与えません.

サイズ目標である9行に収まりました. 

サイズ目標とスピード目標の両方を達成できました.

目次

2021/10/07

ヒューマン・リソース・マシーン 入社9年目−ゼロだけを残せ

 目次

1)課題

「0だけ」を右側に運んでください。

2)解説

入社7年目では0以外のパネルを右のコンベアに運びましたが, この問題では0だけを運ばなくてはなりません. 入社7年目で作成したコードをコピーして貼り付け, JUMP if zeroコマンドのジャンプ先を変更すれば課題をクリアーできそうです.

入社7年目からコードをコピーして貼り付けました. 

JUMP if zeroコマンドの分岐先を変更しました. パネルが0の時はOUTBOXコマンドを実行し, それ以外ではINBOXコマンドに戻るようにJUMPコマンドを入れました. OUTBOXコマンドにより0と書いたパネルを右のコンベアに運んだあとで, 次のパネルを処理するために, JUMPコマンドを追加しました.

このコードを実行すれば課題をクリアーできます. サイズ目標は達成できましたが, スピード目標は達成できていません. スピード目標を達成するためには, 少し工夫が必要です. スピード目標を達成する方法については, 記事を改めて解説します.

目次

2021/10/05

ヒューマン・リソース・マシーン 入社8年目−当社比300%

 目次

1)課題

左側のコンベアの数値を3倍にして右側に運んでください。
TIPS:

課題自体はそれほど難しくありません。効率的なやり方が無いか、考えてみましょう。 

2)解説

始めに, ADDコマンドの効果を確認してみます. 

左のコンベアからパネルを取り, COPYTOコマンドでカーペットの0番に取ったパネルを置きます. そのまま, 持っているパネルとカーペットの0番のパネルを足しました. 左のコンベアから1と書いたパネルを取りましたので, 2と書いたパネルを持っています. つまり, このプログラムは左のコンベアから取ったパネルを2倍にしています. もう1回, ADDコマンドを使えば3倍になるはずです.

ADDコマンドをもう一つ増やしてみました. 予想通り3倍になりました. 残りは, 右のコンベアに運ぶだけです.

OUTBOXコマンドを使って右のコンベアに運び, JUMPコマンドで先頭に戻ります. このプログラムを実行すれば, 課題をクリアーできます.

サイズ目標, スピード目標共に達成できました. 問題文に「効率的なやり方が無いか、・・・・」と書いてあるのでドキドキしましたが, あっけなく達成できました. 

目次

2021/10/02

ヒューマン・リソース・マシーン 入社7年目−ゼロを取り除け

1)課題

「0じゃないデータ」を全て右側に運んでください。

[JUMP if zero]が使用可能になりました。手元のデータが0の時だけ、指定先にジャンプします。0でない場合は次の行を実行します。

2)解説

JUMP if zeroコマンドの使い方を学ぶための問題です. 

コマンドをいくつか並べて, JUMP if zeroコマンドの動作を確認します. INBOXコマンドとJUMP if zeroコマンドを並べ, ステップ実行してみました. 持っているパネルが7なので, 0ではないためJUMP if zeroコマンドの次の行に進みました. 持っているパネルが0であれば, JUMP if zeroコマンドから出ている矢印の先に進み, 続けて1行目のINBOXコマンドを実行します. 

問題文には, 「0じゃないデータ」を右のコンベアに運ぶように書いてあります. 課題をクリアーするために, コマンドを組み合わせる方法を考えてみます. 

  1. 左のコンベアからパネルを取り出します. 
  2. パネルが0なら, 先頭に戻ります. 
  3. パネルが0でなければ, パネルを右のコンベアに運び, 先頭に戻ります.

手順通りにコマンドを並べました. このコードを実行すると課題をクリアーできます.

この課題をクリアーすると, これ以降, サイズ目標とスピード目標が表示されます. 両方とも達成できました.

3)補足 

JUMP if zeroコマンドがエラーとなる条件を確認します.

パネルを持たずにJUMP if zeroコマンドを実行するとエラーとなり, 上司に怒られます.

4)まとめ

  1. この課題では, JUMP if zeroコマンドを使って, 持っているパネルが0かどうかを判定する方法を学びました. 
  2. JUMP if zeroコマンドを使えば, 持っているパネルの値によって次に実行するコマンドを選択できます.
  3. パネルを持たずにJUMP if zeroコマンドを実行すると, エラーとなります.
  4. この問題から, サイズ目標とスピード目標が示されます. プロならば, これらの目標をクリアーしたいところです. 

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

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