炬燵の中でゲーム三昧

ゲームのプレイ雑記やあれこれ

ヒューマン・リソース・マシーン 攻略メモ#1 効率化目標達成(YEAR 1 ~ YEAR 10)

 「ヒューマン・リソース・マシーン」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 を得ることができる。