ヒューマン・リソース・マシーン 攻略 入社24年目 あまりはいくつ?
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左側の数値2つ(A,B)ごとに割り算(A / B)を行い、その剰余(あまり)を右側に運んでください。
実際に割り算する必要はありません。割り算の意味を改めて考えてみましょう。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:12行
- スピード:57ステップ
ヒント
その1
掛け算は足し算です。では割り算は?
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// あまりを右に運ぶ 2. add B // 減算した数値を加算することで減算前の値を復元 3. outbox ラベル1:// 1セットの開始位置 4. inbox 5. copyto A 6. inbox 7. copyto B 8. copyfrom A ラベル3:// 超えるまで減算を繰り返す 9. sub B 10. jump_if_neg:ラベル2へ 11. jump:ラベル3へ
割り算は引き算で表せるので、ひたすら減算。
今回はあまりを出すだけでよいので、マイナスになるまで減算して、直前の値を運べばよい。
左のパネルを取って(inbox)、Aとして保持(copyto)
次のパネルを取って(inbox)、Bとして保持(copyto)
初期値としてAを取得(copyfrom)し、マイナスになったら(jump_if_neg)結果を運ぶ。
マイナスじゃなければ、減算を繰り返す(jump)
結果を運ぶ際は、手元にあるのは計算後の結果のため、減算した値を加算(add)することで減算前の値を復元してから、右側へ運ぶ(outbox)
例によって無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす(jump)。