ヒューマン・リソース・マシーン 攻略 入社16年目 必ずポジティブに
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左側のコンベアの数値を右側に運んでください。
ただし、その数値がマイナス値である場合は、マイナスを外してから右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:8行
- スピード:36ステップ
ヒント
その1
マイナスを外すということはA * -1 これを減算で表すと?
その2
A * -1 → 0 - A 。0を作るためにはどうする?
その3(スピード目標)
これまた[9年目]のスピード目標と同じ発想。
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// マイナスを外す 2. copyto 0 3. sub 0 4. sub 0 ラベル3:// 右へ運ぶ 5. outbox ラベル1:// 1セットの開始位置 6. inbox 7. jump_if_neg:ラベル2へ 8. jump:ラベル3へ
マイナスを外す→ A * -1 = 0 - A = (A - A) - A なので、自身を2回減算することでマイナスを外せる。
左のパネルをとって(inbox)、マイナスの場合は減算用に一旦保持(copyto)して、2回減算(sub)して運ぶ(outbox)
マイナスじゃない場合は、そのまま運ぶ(outbox)
この時、[9年目]と同様に無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす。