ヒューマン・リソース・マシーン 攻略 入社26年目 割り算のしかた
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左の各数値に対して、0までカウントダウンを行い自身を含めたすべての数値を加算した結果を出力せよ。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:15行
- スピード:76ステップ
ヒント
その1
A / B = 商 … 余り
24年目で割り算の余りを出せたから、その過程に手を入れれば商も取れる
商を毎回初期化するのを忘れずに
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// あまりを右に運ぶ 2. copyfrom C 3. outbox ラベル1:// 1セットの開始位置 4. copyfrom 9 5. copyto C 6. inbox 7. copyto A 8. inbox 9. copyto B ラベル3:// 超えるまで減算を繰り返す 10. copyfrom A 11. sub B 12. jump_if_neg:ラベル2へ 13. copyto A 14. bump+ C 15. jump:ラベル3へ
24年目で割り算の余りを出した。減算した回数 = 商 なので、減算回数をカウントして商を求めるだけ。
初期値として0(copyfrom C)を設定(copyto C)
左のパネルを取って(inbox)、Aとして保持(copyto)
次のパネルを取って(inbox)、Bとして保持(copyto)
A(copyfrom)からBを減算(sub)し、マイナスになったら(jump_if_neg)、計算結果(copyfrom C)を運ぶ(output)。
マイナスじゃなければ、計算結果を保持(copyto)して、商をカウントアップ(bump+)
これを減算結果がマイナスになるまで繰り返す(jump)
結果を運ぶ際は、手元にあるのは計算後の結果のため、減算した値を加算(add)することで減算前の値を復元してから、右側へ運ぶ(outbox)
例によって無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす(jump)。