2021/12/24

ヒューマン・リソース・マシーン 入社37年目−次へつなげよ

1)課題

6つのデータペアが配置されています。右側の数字は次のペアの位置番号です。

左側の各数値に対し、数珠つなぎにペアをたどり、その際に通過したペアの左側の文字を右側に運んで下さい。

右側の数字がマイナスの場合、数珠つなぎは終了です。


2)考え方

カーペットのパネルの配置から, 次のような手順で処理をすればクリアーできそうです.

  1. 「アドレス」にパネルを配置する.
  2. 「アドレス」が示すパネルを右のコンベアに運ぶ. この時, パネルには文字が書いてある.
  3. 「アドレス」を1増やす.
  4. 「アドレス」が示すパネルを「アドレス」に配置する. この時, パネルには数字が書いてある.
  5. 「アドレス」の数字がマイナスなら終了

3)実装

上で考えた方針に従い, プログラムを作ります.

ほぼ, そのまま実装できました. 「アドレス」がマイナスかどうかの判定を前の方に持ってきています. 

あっさりとクリアーできてしまいました. サイズ目標, スピード目標共に達成です. 

目次

2021/12/14

ヒューマン・リソース・マシーン 入社36年目−辞書順に並べよ

1)課題

左側のコンベアに2つの単語が運ばれてきます。辞書順で並べたときに、先に来る単語を右側に運んで下さい。

2)考え方

単語を辞書順に並べるのですから, 1文字ずつ比較していきます. 異なる文字が現れれば, 並び順の小さい文字を含む単語を右のコンベアに運びます. 注意点として, 2つの単語の文字数が異なる場合, 短い方の単語を運びます. 

プログラムは大きく3つの部分から構成します.

  1. 左のコンベアからパネルを取り出し, カーペットに配置する.
  2. カーペットに配置した2つの単語を構成する文字を1文字ずつ比較し, 先に来る単語を特定する.
  3. 先に来る単語を右のコンベアに運ぶ.

プログラムを作るために, いくつか名前を決めていきます. 

  1. 左のコンベアから取り出した1つ目の単語をAとします. 
  2. 2つ目の単語をBとします. 
  3. 単語Aのアドレスを記録するカーペットをADR-Aとします.
  4. 同様に単語BのアドレスをADR-Bとします.
  5. 最後に右のコンベアに単語を運ぶためのアドレスをOUTとします.

3)実装

プログラムを作っていきます. 

カーペットに名前を付け, 左のコンベアから運び出したパネルをカーペットに配置します. カーペットの23番に0, 24番に10と書いたパネルがあります. 単語Aを配置し始めるカーペットの番号に0を割り当て, 単語Bは10を割り当てます.

15行目から, ADR-AとADR-Bを再初期化し, 1文字ずつの比較に備えます. 

続けて, 単語Aと単語Bが終端を表す0に到達しているか調べ, 0になっている単語を運び出します. 運び出す単語のアドレスをOUTに設定しています. OUTを使って単語を運び出せますので, 運び出す処理を1つにまとめられます. 

23行目から1文字ずつ比較するコードを書いていきます. 23行目に到達した時点で単語Bの文字を持っていますので, 単語Aの文字とSUBコマンドを使って比較します. 

結果が0なら同じ文字ですので, 次の文字を比較するためにADR-AとADR-Bを1増やし, 19行目に戻ります. 

結果が0でなくマイナスの場合, 単語Aの文字の方が大きいということですから, 単語Bを運ぶためにカーペット24番の10運ぶ準備をします. 

結果がプラスの場合, 単語Aを運ぶためにカーペット23番の0をOUTに運ぶ準備をします. 

OUTを使ってカーペットに置いてあるパネルを運び出します. OUTが示すカーペットのパネルが0になるまで, 右のコンベアに運び, OUTを1増やす操作を繰り返します.

クリアーできました. サイズ目標を達成できています. スピード目標はもう少しで達成できます. 

目次

2021/12/10

ヒューマン・リソース・マシーン 入社35年目−ダブりを省け

目次

1)課題

入力側のデータを出力側に運んで下さい。ただし、重複したデータは破棄してください。

2)考え方

方針は次のようになります.

  1. 左のコンベアからパネルを取り出し, カーペットに配置していないかを調べます. 
  2. カーペットになければ, 左のコンベアから取り出したパネルをカーペットに追加し, 右のコンベアに運びます.

どのカーペットまでを使ったかを記録するため, カーペット14番にある0を使います. このカーペットに「上限」と名前を付けます. 

また, 右のコンベアから取り出したパネルを一時的にカーペットに配置するための場所も必要になります. カーペットの13番に「文字」と名前を付けます. 

更に, カーペットに配置してあるパネルの内, どこまで調べたかを記録する場所も必要です. カーペットの12番に「アドレス」と名前を付けます. 「アドレス」は「上限」から始めて, 0に向けて減らしていきます. こうすることで, 使用するコマンドを減らせます.

この問題でよく考えなくてはいけないことは, 最初の1枚をどうするか, です. カーペットに何も無い状態から始めて一般的にプログラムを作れると良いのですが, 「アドレス」の扱いが難しくなります. プログラムを簡単にするために, 1枚目のパネルは特別扱いし, カーペットの0番に配置し, 無条件で右のコンベアに運びます.

3)実装

初期化から始めます.

左のコンベアから1枚目のパネルを取り出し, カーペットの0番に配置します. そのまま右のコンベアに運びます. 続けて, 「上限」の値を「アドレス」にコピーします. 4行目以降のコードを2枚目以降のパネルで使いますので「2文字目」とラベルを付けています.

6行目でINBOXコマンドを使って左のコンベアからパネルを取り出し, 「文字」に配置します. 続けて, 「アドレス」が示す文字と比較し, 同じならそのパネルを捨ててしまうためにそのまま4行目に戻ります. 文字が異なるなら, 「アドレス」を1減らし, 次の文字との比較に備えます. 

11行目で「アドレス」がマイナスになっているか判定しています. マイナスであれば, 「文字」は初めて現れた文字ですから, 右のコンベアに運びます. この時, 「上限」を1増やして, カーペットに追加します. OUTBOXコマンドを使うと持っているパネルが無くなりますので, コマンドの順序に注意してください.

「アドレス」がマイナスでない場合, カーペットの次の文字との比較をするため, 改めて「文字」からパネルを取り出し, 8行目に戻ります. 

プログラムを実行するとクリアーできます. サイズ目標達成まであと1行です. スピード目標は, 目標値を下回って達成できていました. 1文字目を特別扱いしないコードにすれば, もっと良くなるかもしれません. 

目次

2021/12/08

ヒューマン・リソース・マシーン 入社34年目−母音を省け

目次

1)課題

左側の文字を右側へ運んで下さい。ただし、母音(A, E, I, O, U)は捨ててください。

2)考え方

カーペットに母音がありますので, 左のコンベアから取り出したパネルがカーペットのパネルとすべて異なれば, 母音ではありません. 次のように考えていきます.

  1. カーペットに「アドレス」を作り, 0で初期化する.
  2. 左のコンベアから取り出したパネルをカーペットの「文字」に配置する.
  3. 「アドレス」が示すパネルと「文字」を比較し, 同じなら「文字」は母音なので先頭に戻る. 異なるなら母音ではないので, アドレスを1増やす.
  4. 「アドレス」が示すパネルが「0」なら, 「文字」が母音でないので, 「文字」を右のコンベアに運びます.

3)実装

プログラムを作っていきます. まずは初期化から.

カーペットに名前を付けます. 元々, カーペットの5番に置いてあった0が母音の終了を表すので, 「終端」と名前を付けています. カーペットに「アドレス」と「文字」の名前を付け, 「アドレス」には「終端」からコピーした0を配置し, 「文字」には左のコンベアから取り出したパネルを配置します.

「アドレス」が示すパネルをカーペットから取り, 終端に到達したか判定します. 「0」であれば終端に到達し, 「文字」は母音ではありませんので右のコンベアに運びます.

「アドレス」が示すパネルが「0」でない場合, 母音であるか判定します. 母音であるパネルを持っていますので, SUBコマンドを使って「文字」と比較します. 結果が0なら母音, 異なるなら子音です. 母音の時, パネルを捨てるので, 先頭に戻ります. 子音の時, 「アドレス」を1増やし, 次の母音と比較するために5行目に戻ります.

プログラムを実行すると課題をクリアーできます. サイズ目標, スピード目標共にあと一歩, といったところです. 

目次

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コマンドにより先頭に戻り, 繰り返します.

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

目次

2021/12/02

ヒューマン・リソース・マシーン 入社31年目−文字列を逆に

目次

1)課題

複数の「0区切り文字列」が置かれています。

各文字列を逆から順に読んだ結果を、右側に運んで下さい。

2)考え方

方針は次のようになります.

  1. 左のコンベアからパネルを取り出し, カーペットの0番から順にパネルを置きます.
  2. パネルの値が「0」なら, 逆順にカーペットからパネルを取り, 右のコンベアに運びます.

左のコンベアから取り出したパネルを置くカーペットの位置を示すために, アドレスを記録するパネルが必要となります. また, このアドレスは右のコンベアに運ぶパネルの位置も示します. 

3)実装

方針に従い, プログラムを作成します.

元々,「0」と書いてあるパネルを置いてあるカーペットに「ZERO」と名前を付けます. また, 左のコンベアから取り出したパネルを置くカーペットの位置を「アドレス」によって示します. 続けて, INBOXコマンドによりパネルを取り出し, 「0区切り文字」であるか判定します. 0であれば「はこびだし」, 0でなければ「とりこみ」に進みます.

左のコンベアからパネルを取り込むためのコードを作成しました. 「アドレス」が示すカーペットの位置にパネルを置き, 「アドレス」の値を増やします. JUMPコマンドにより, 次のパネルを取り込みます. 

ここまで作成したコードをステップ実行し, 動作を確認しました. パネルをカーペットに配置し, 「0区切り文字」を取り出したところで「はこびだし」に進んでいます. 続けて「はこびだし」の処理を書いていきます. ここで, 「アドレス」の値が「4」となっていることに注意してください.

運び出すためには, まず, 「アドレス」の値を1減らします. 「アドレス」の値がマイナスになった場合, すべてのパネルを運び出せたので先頭に戻ります. 「アドレス」の値が0以上の場合, 「アドレス」が示すカーペットのパネルを取り出し, 右のコンベアに運びます. 「アドレス」の値がマイナスになるまで繰り返します. 

クリアーできました. サイズ目標まであと1行です. 

目次

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

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