ヒューマン・リソース・マシーン 攻略 入社21年目 ゼロが区切り
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左にいくつかの「0で終わる数値グループ」が置いてあります。
書くグループ内の数値の合計値を算出し、右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:10行
- スピード:27ステップ
ヒント
その1
まずは問題分をそのまま命令に置き換える。
ただ、0しかないケースを特別に考慮
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// 計算結果を取得 2. copyfrom 0 ラベル3:// 右側へ運ぶ 3. outbox ラベル1:// 1セットの開始位置 4. inbox 5. jump_if_zero:ラベル3へ ラベル4:// 加算 6. copyto 0 7. inbox 8. jump_if_zero:ラベル2へ 9. add A 10. jump:ラベル4へ
単純に0を拾うまで加算を繰り返すだけ。
最初が0だった場合は即運ぶ。
左のパネルを取って(inbox)、0なら(jump_if_zero)運ぶ(outbox)
0じゃないなら、加算結果として保持(copyto)
次のパネルを取って(inbox)、0なら(jump_if_zero)、計算結果(copyfrom)を運ぶ。
0じゃないなら、加算(add)。これを0を拾うまで繰り返す(jump)
この時、例によって無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす(jump)。