2022/01/03

ヒューマン・リソース・マシーン 入社38年目−数字をバラせ

目次


1)課題

左側のパネルの数字を桁ごとに分解して右側へ運んで下さい。

例えば数字が123だったら、答えは「1, 2, 3」となります。

2)考え方

一般的なプログラミング言語であれば, 10で割った商と余りを使って一の位から順に処理していきますが, ヒューマン・リソース・マシーンには割り算がありませんので工夫が必要です. 

カーペットには, 0, 10, 100と書いたパネルが置いてありますので, これらを使っていきます. アルゴリズムは次のようになります.

  1. 100で割った結果を右のコンベアに運び, 余りをカーペットに置いておく. 
  2. 余りを10で割った結果を右のコンベアに運び, 余りも右のコンベアに運ぶ.

この問題を解くときにもう一つ注意点があります. 上司に解答例を尋ねると, 3などの一桁の数は3のみを右のコンベアに運んでおり, 百の位の数が0の場合はコンベアに運びません. この条件が無ければ, もっと簡単なのですが.

3)初期化

初期化のためのコードを書きます.

カーペットの0番に「一の位」, 1番に「十の位」, 2番の「百の位」と名前を付けます. 元々, パネルを置いてあるカーペットにもパネルの値をカーペットの名前とします. 

続けて, 「百の位」と「十の位」に0を置きます. 「一の位」には左のコンベアから運んだパネルを置きます.

4)百の位

初期化が終わりましたので, 百の位を求めます.

「一の位」のパネルから「100」を引きます. 結果がマイナスでない時, 「百の位」を1増やし, 結果がマイナスになるまで繰り返します. 結果がマイナスになれば, 「百の位」には百の位の値が入っています. その値が0でなければ右のコンベアに運びます. 

5)十の位

百の位と同様に十の位を求めます.

15行目から20行目までが十の位を求めるコードです. 百の位と処理内容は同等です.

6)十の位と一の位の出力

十の位の計算が終わると, 「十の位」と「一の位」に右のコンベアに運ぶべき値が入っています. 問題は, 「百の位」が0の時, 「十の位」の値も0であれば, 「一の位」だけを右のコンベアに運びます. それ以外の時は, 「十の位」に続けて「一の位」を出力します. 

21行目から「十の位」と「一の位」を出力するためのコードです.

21行目から, 「百の位」が0であるか判定しています. 0でなければ, 26行目にジャンプして, 「十の位」と「一の位」を出力します. 

「百の位」が0の場合, 「十の位」が0であるか判定しています. 0でなければ「十の位」を出力し, そのまま「一の位」を出力します. 「十の位」が0の場合, 28行目にジャンプして, 「一の位」を出力します. 最後に, 30行目で先頭に戻ります.

課題をクリアーできました. サイズ目標を達成できました. スピード目標は, どうしたものでしょう?

目次

0 件のコメント:

コメントを投稿

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

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