「ヒューマン・リソース・マシーン」YEAR 1 ~ YEAR 10 の考え方と解答例(サイズ、スピード目標達成)。 ネタバレになるので、解答例は折りたたんでいます。
YEAR 1 運び屋さん
▼ 解答
1: inbox 2: outbox 3: inbox 4: outbox 5: inbox 6: outbox
サイズ:6 行(目標 6 行)、スピード:6 ステップ(目標 6 ステップ)
YEAR 2 忙しい運び屋さん
jump 命令により、繰り返しの処理をシンプルに記述可能。
効率化を考えた場合、サイズ目標とスピード目標を同時に達成するのはおそらく不可能。
jump 命令を用いればサイズ(行数)は少なくなるが、jump 命令を実行する分スピード(ステップ数)は落ちる。
▼ 解答
// サイズ目標達成 (1) 1: inbox 2: outbox 3: jump // (1) へジャンプ
サイズ:3 行(目標 3 行)、スピード:30 ステップ(目標 25 ステップ)
// スピード目標達成 1 (1) 1: inbox 2: outbox 3: inbox 4: outbox 5: jump // (1) へジャンプ
サイズ:5 行(目標 3 行)、スピード:25 ステップ(目標 25 ステップ)
スピード目標を達成するためには、ループ内で二回同じ処理を行えば良い。 以下のように jump 命令を使わず記述しても可(ステップ数は最小になる)。
// スピード目標達成 2 1: inbox 2: outbox 3: inbox 4: outbox : 23: inbox 24: outbox
サイズ:24 行(目標 3 行)、スピード:20 ステップ(目標 25 ステップ)
YEAR 3 コピーのお仕事
▼ 解答
1: copyfrom 4 2: outbox 3: copyfrom 0 4: outbox 5: copyfrom 3 6: outbox
サイズ:6 行(目標 6 行)、スピード:6 ステップ(目標 6 ステップ)
YEAR 4 逆にして運んで
▼ 解答
(1) 1: inbox 2: copyto 0 3: inbox 4: outbox 5: copyfrom 0 6: outbox 7: jump // (1) へジャンプ
サイズ:7 行(目標 7 行)、スピード:21 ステップ(目標 21 ステップ)
YEAR 6 真夏の雨
▼ 解答
(1) 1: inbox 2: copyto 0 3: inbox 4: add 0 5: outbox 6: jump // (1) へジャンプ
サイズ:6 行(目標 6 行)、スピード:24 ステップ(目標 24 ステップ)
YEAR 7 ゼロを取り除け
▼ 解答
(1) 1: inbox 2: jump if zero // (1) へジャンプ 3: outbox 3: jump // (1) へジャンプ
サイズ:4 行(目標 4 行)、スピード:23 ステップ(目標 23 ステップ)
YEAR 8 当社比 300%
▼ 解答
(1) 1: inbox 2: copyto 0 3: add 0 4: add 0 5: outbox 6: jump // (1) へジャンプ
サイズ:6 行(目標 6 行)、スピード:24 ステップ(目標 24 ステップ)
YEAR 9 ゼロだけを残せ
YEAR 7 の逆で、0 を残す処理を行う課題。
データの処理順(inbox -> outbox)通りに素直にコードを組むとおそらくサイズ、スピード目標が達成できない。
そのときは、どの命令を削れそうかを考える。
この課題の場合、データを左のレーンから受け取る inbox 命令、右のレーンに送る outbox 命令を削ることは不可能。
命令の順番を工夫することで、inbox 命令で取得したデータが 0 だった場合に実行される jump 命令の数は一つに抑えられる。
▼ 解答
1: jump // (2) へジャンプ (1) 2: outbox (2) 3 inbox 4: jump if zero // (1) へジャンプ 5: jump // (2) へジャンプ
サイズ:5 行(目標 5 行)、スピード:25 ステップ(目標 25 ステップ)
outbox 命令を先に記述することで、左のレーンから取得したデータが 0 だった場合に実行される jump 命令の数を一つに減らせる。 何のデータも取得していない初期状態で outbox 命令を実行するとエラーとなるので、jump 命令で最初の outbox 命令を飛ばす必要があることに注意。
YEAR 10 3 回で 8 を
YEAR 8 と同様、左のレーンから取得した数をを 8 個足し合わせることで、目的の 8 倍の値を得ることができる。
一方、ステージタイトルにあるように、3 回の加算で 8 倍の値を得ることが可能。
8 という数値に着目したとき、8 = 23(8 = 4 + 4、4 = 2 + 2、2 = 1 + 1)であることに注意。
▼ 解答
(1) 1: inbox 2: copyto 0 3: add 0 4: copyto 0 5: add 0 6: copyto 0 7: add 0 8: outbox 9: jump // (1) へジャンプ
サイズ:9 行(目標 9 行)、スピード:36 ステップ(目標 36 ステップ)
8 = 23 なので、元の値 x を足して 2x を取得、2x を一旦カーペット上に保管、手元の 2x とカーペット上の 2x を足して 4x = 2 × 2x を取得、同様に 8x を取得。 計 3 回の加算で 8 倍の数 8x を得ることができる。