2021/12/04

ヒューマン・リソース・マシーン 入社32年目−同じのはいくつ?

目次

1)課題

左側の各パネルの文字に対しカーペット上に同じものが何個あるかをカウントし、右側にそのカウント結果を運び出してください。

2)考え方

左のコンベアから取り出したパネルが「X」なら, カーペットに置いてあるパネルから「X」を見つけ, その結果を右のコンベアに運びます. これには, 次の値を管理しなくてはなりません.

  1. カウントしている値, これを「カウンタ」と呼びます. 
  2. どのカーペットまで調べたかを示すアドレス, これを「アドレス」と呼びます.
  3. 左のコンベアから取り出したパネル, これを「文字」と呼びます.

「カウンタ」と「アドレス」は0から始めます.

これらの値を使って, 手順を書いていきます.

  1. 「カウンタ」と「アドレス」を0で初期化する.
  2. 左のコンベアからパネルを取り出し, 「文字」に配置する.
  3. 「アドレス」が示すカーペットのパネルを取り出し, 「0」であるか判定する.
    「0」であれば, 「カウンタ」の値を右のコンベアに運び先頭に戻る.
  4. 「0」でなければ「文字」のパネルと比較する.
    同じであれば, 「カウンタ」を1増やす.
  5. 「アドレス」を1増やし, 3行目に戻る.

3)実装

考えた手順からプログラムを作成します.

カーペットに名前を付け, 「カウンタ」と「アドレス」に0を配置します. また, 左のコンベアからパネルを取り出し, 「文字」に配置します.

「アドレス」が示すカーペットのパネルを取り, 0であるか判定します. 0であれば, カーペットに配置してあるパネルの最後に到達したということです. 0でなければ, 左のコンベアから取り出したパネルと同じかどうかを調べます.

「アドレス」が示すパネルの値が0でない場合の処理を作ります. 7行目のJUMP if zeroコマンドを使ったとき, 「アドレス」が示すパネルを持っていますので, そのまま「文字」に置いたパネルと同じかどうかを判定します. 

判定にはSUBコマンドを使い, 同じであればSUBコマンドの結果は0となります. 結果が0, つまり「おなじ!」であれば, 「カウンタ」と「アドレス」を1増やします. 結果が0以外, つまり「ちがう」であれば, 「アドレス」だけを1増やします. 

7行目のIF zeroコマンドは, 「アドレス」が示すパネルが0であるかどうかを判定します. 0の場合, つまりカーペットの終端に到達した場合の処理を書きます. 「カウンタ」には「文字」と同じパネルの出現回数が入っていますので, それを右のコンベアに運びます. 運び終われば, JUMPコマンドにより先頭に戻り, 繰り返します.

プログラムを実行するとクリアーできます. サイズ目標を達成できましたが, スピード目標を達成するためにはもう一工夫必要です.

目次

0 件のコメント:

コメントを投稿

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

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