ヒューマン・リソース・マシーン 攻略 入社25年目 ゼロまで足して
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左の各数値に対して、0までカウントダウンを行い自身を含めたすべての数値を加算した結果を出力せよ。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:12行
- スピード:82ステップ
ヒント
その1
そのまま問題分を命令に置き換えるだけ。
カウンタの概念は20年目で実施済み
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// 加算結果を取得 2. copyfrom 0 ラベル3:// 右へ運ぶ 3. outbox ラベル1:// 1セットの開始位置 4. inbox 5. jump_if_zero:ラベル3へ 6. copyto 0 7. copyto 1 ラベル4:// カウンタが0になるまで加算する 8. bump- 1 9. jump_if_zero:ラベル2へ 10. add 0 11. copyto 0 12. jump:ラベル4へ
今回は問題文を命令に置き換えるだけ。カウンタの概念は既に20年目で実施している。
左のパネルを取って(inbox)、0なら運ぶ(outbox)
0じゃないなら、初期値 および 計算値 として保持(copyto)
初回分は初期値として加算済みであるため、カウンタを更新(sub)
カウンタが0ならば(jump_if_zero)、計算結果(copyfrom)を運ぶ(outbox)
0じゃなければ、これまでの計算結果を加算(add)して、計算結果を保持(copyto)
これをカウンタが0になるまで繰り返す(jump)
例によって無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす(jump)。