ヒューマン・リソース・マシーン 攻略 入社9年目 ゼロだけを残せ
たぶんここら辺から解き方が色々出てくる。
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
「0だけ」を右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- jump
- jump_if_zero
効率目標
- サイズ:5行
- スピード:25ステップ
ヒント
その1
まずはそのまま問題文を命令に置き換えよう。
その2(スピード目標)
無駄なjumpを減らすためには、これまでとは違う発想が必要。 使う命令は変えずに処理順だけ組み換え。
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル2:// 右へ運ぶ 2. outbox ラベル1:// 1セットの開始位置 3. inbox 4. jump_if_zero:ラベル2へ 5. jump:ラベル1へ
問題文をそのまま命令に置き換えると↓みたいな感じになる。
ラベル1:// 1セットの開始位置 1. inbox 2. jump_if_zero:ラベル2へ 3. jump:ラベル1へ ラベル2:// 右へ運ぶ 4. outbox 5. jump:ラベル1へ
左のパネルをとって(inbox)、0ならば(jump_if_zero)右側に運ぶ(outbox)。
そうじゃないなら運ばないで次へ(inbox)。
これを1セットとして、ひたすらに繰り返す(jump)
ただ、これだとスピード目標が未達。
outboxをする際に、わざわざjump_if_zeroでジャンプしてきたのに、
処理が終わってからもjumpするので、1連の処理の中で2回ジャンプが発生してしまっており、
ジャンプが1回分無駄に発生している。
なので、outbox終了後にjumpせずとも次(inbox)へつながるように、outboxをinboxの前に移動。
単純に移動しただけだと、最初の何も持っていない状況でもoutboxを実行してしまうので、
最初の1回目だけoutboxを実行しないように、jumpで飛ばす。