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行です. 

目次

2021/11/30

ヒューマン・リソース・マシーン 入社30年目−隠された暗号

目次

1)課題

左側のいくつかのアドレス番号があります。

それが指す文字を1文字目とし、それに続く文字を「0」に遭遇するまで、全て右側に運んで下さい。

2)考え方

入社29年目で学んだ間接指定を使っていきます. 左のコンベアにあるパネルには一文字目のアドレスを書いてあります. 例えば, 左のコンベアのパネルが「4」であれば, カーペットの4番「T」の文字から右のコンベアに運べば, 上司の要求に応えられます. 手順は次のようになります.

  1. 左のコンベアからパネルを取り出し, カーペットの24番に置く. 
  2. 間接指定により, カーペット24番が示すパネルを取る.
  3. 取ったパネルが「0」なら先頭に戻る.
  4. 「0」でなければ, 持っているパネルを右のコンベアに運ぶ.
  5. カーペット24番を1増やす. 
  6. 2行目に戻り, カーペットの次のパネルを取る.

3)実装

カーペットの24番に「アドレス」と名前を付けます. 上で考えた手順をそのままプログラムに落とし込みます. 

見ての通り, そのままです. これを実行すると課題をクリアーできます.

サイズ目標, スピード目標共にクリアーできました.

目次

2021/11/27

ヒューマン・リソース・マシーン 入社29年目−間接的な指定

 目次

1)課題

左側の各数値は、カーペット上の番号を示しています。各番号の場所におかれている文字を取得し、右側に運んで下さい。

「データの間接指定」が出来るようになりました。下記の例を実行して、直接していとの違いを感じてみましょう。

2)解説

この課題では, カーペットの12番に対して2種類のCOPYFROMを配置しています. ステップ実行してみます. 

2行目のCOPYFROMコマンドを実行すると, カーペットの12番に置いてあるパネルの値をカーペットの番号とみなして, カーペットの8番に置いてあるパネルを取ります. これが, 「データの間接指定」と呼ばれる理由です.

この結果を使って課題に取り組みます. 手順としては次のようになります.

  1. INBOXコマンドを使って左のコンベアからパネルを取り出し, カーペットの12番に置く. 
  2. COPYFROMコマンドを「間接指定」でカーペットの12番に対して実行する. 
  3. OUTBOXコマンドを使ってパネルを右のコンベアに運ぶ. 

この通りにプログラムを作ってみました. これを実行すると課題をクリアーできます. 

3)間接指定の注意事項

間接指定をする場合, 上司に怒られないように細心の注意が必要となります.

間接指定である/なしにかかわらず, パネルを置いていないカーペットを指定すると上司に怒られます.

間接指定の場合, 数値以外のパネルを置いてあるカーペットを指定しても上司に怒られます.

カーペットの12番に置いてあった8を使って16に増やしました. カーペットは0番から14番までしかありません. その範囲外を指定しても上司に怒られます. 実務でこういうことをやらかすと対応が難しいので注意が必要です. 「注意しましょう」で解決するなら苦労はしません. 実務での解決法については, 別の機会に. 

目次

2021/11/23

ヒューマン・リソース・マシーン 入社28年目−小から大へ

 目次

1)課題

左側の数値3つごとに対し、小さい順に並べ替え、右側に運んで下さい。

2)考え方

3つの数値をA, B, Cとします. 3つの数値の大小関係を調べ, 条件分岐をしていきます.

(1)A<Bの時

A<CならAが最小となる. B<Cなら小さい方からA, B, Cの順になり, C<BならA, C, Bの順になる.

C<AならCが最小となり, 小さい方からC, A, Bの順になる.

(2)B<Aの時

B<CならBが最小となる. A<Cなら小さい方からB, A, Cの順になり, C<AならB, C, Aの順になる.

C<BならCが最小となり, 小さい方からC, B, Aの順になる.

3)もう一工夫

これをそのままコードに落とし込んでいっても良いのですが, コードの見通しが悪くなり, うまく動かないときの対応が難しくなります. そこで, BとCを比較し, C<Bなら, BとCを入れ替えます. つまり, 必ずB<Cであることにして, Aとの比較を考えます. 

(1)A<Bの時

Aが最小となり, B<Cであるから, 小さい方からA, B, Cの順になる.

(2)B<Aの時

Bが最小となる. A<Cなら小さい方からB, A, Cの順になり, C<AならB, C, Aの順になる.

B<Cを保証することで, 大小を比較する回数を減らすことができました. 

4)実装

問題文には予め, 左のコンベアから3枚のパネルを取り出し, カーペットの0番から2番に配置するコードを書いてあります. ここからスタートしていきます. 

まず, カーペットの0番に「A」, 1番に「B」, 2番に「C」,3番に「SWAP」と名前を付けます. C<Bの場合, 「SWAP」と名前を付けたカーペットを使って, BとCのパネルを入れ替えます. ステップ実行して, B<Cの順になることを確認します.

続けてAとBを比較します. 比較結果から, 最小となる値が決まりますので, 最小のパネルを右のコンベアに運びます. なお, 問題文では「小さい順に並び替え」と書いてありますが, 上司は右のコンベアに運んだパネルしか見ていませんので, 放っておいて大丈夫です.

続けて, 分かりやすい方を片付けます. Aが最小と分かれば, 小さい順にA, B, Cと並びますので, その順に右のコンベアに運びます. 25行目のJUMPコマンドは先頭にジャンプさせています. 

次に, Bが最小の場合を考えていきます. まず, 残りのAとCを比較します. 小さい方のパネルを右のコンベアに運ぶところまでコードを書いて, 動作を確認します.

残るは最大のパネルを右のコンベアに運ぶだけです. 35行目と40行目のJUMPコマンドは先頭に戻っています. ここまでできれば, 課題をクリアーできます. 

分かりやすさを優先しましたので, サイズ目標, スピード目標共に達成できていません. 達成するためには, OUTBOXコマンドの使用回数を減らすところから取り掛かると思います. これについては, 原稿を改めます.

目次

2021/11/20

ヒューマン・リソース・マシーン 入社26年目−割り算のしかた

目次

1)課題

左側の数値2つ(A, B)ごとに割り算(A÷B)を行い、その商を右側へ運んで下さい。

ただし、2つ目の数字に0が来る事は無いものとする。

TIPS: 前の課題で書いたコードを「コピー&はりつける」で持ってくると手間が省けて便利かもしれません。

2)解説

入社24年目で, 割り算をした余りを求めました. この課題では, 余りではなく商, つまりAからBを何回引けるか, を求めます. まず, 問題文にもあるように, 入社24年目で作成したコードをコピーして貼り付けます. 

入社24年目からコードをコピーして貼り付けました. ここからプログラムを改造していきます.

  1. 初期設定する時, 商を表すカーペットに0を配置します. このカーペットに「Q」と名前を付けます.
  2. 「A-B」の結果がプラスであれば, 「Q」を1増やします. つまりBUMP+コマンドを使います. JUMPコマンドで引き算に戻る時, 「A」のパネルに持ち替えることに注意してください.
  3. 「A-B」の結果がマイナスであれば, 「Q」の値を右のコンベアに運びます.

コードを修正するとこのようになります. これを実行すると課題をクリアーできます.

サイズ目標まであと1行です. 簡単に修正できますが, このままにしておきます. スピード目標については, 入社24年目と同様に達成できてしまいました. 開発元がどのような想定でプログラムを作成したのか気になります.

目次 

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

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