ヒューマン・リソース・マシーン 攻略 入社14年目 大は小を兼ねる
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左側の数値2つごとに数字の大証を比較し、大きい方の数値を右側に運んでください。 もし同値である場合、いずれかを右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- jump
- jump_if_zero
- jump_if_neg
初出命令
- jump_if_neg
手元のデータがマイナスの時だけジャンプする。パネルを手に持っていない状態で実施すると?
上司に怒られてお仕事中断(終了)。
効率目標
- サイズ:10行
- スピード:34ステップ
ヒント
その1
実は13年目と考え方は大差ないです。 B < A これを式変換(右辺を移項)するとどうなる?
その2(スピード目標)
計算した後は手元のパネルが書き変わっている。
だからと言って両方の数値を保持していたらステップが無駄になる。
B - A = x じゃあ x をどうやったらBに戻せる?
回答例 + 解説
サイズ + スピード
回答例 + 解説
- ①
- inbox
- copyto 0
- inbox
- sub 0
- jump_if_neg:②へ
- add 0
- jump:③へ
- ②
- copyfrom 0
- ③
- outbox
- jump:①へ
B < A → B - A < 0 なので、2つを減算してマイナスの時はAを、マイナスじゃないときはBを右側に運べば良い。
この時、手元のパネルは計算結果(x)なので、Bを運ぶときは、x + A でBの値を復元するのがスピード目標を満たす上でのポイント。
左のパネルをとって(inbox)、比較用に一旦保持(copyto)、
次のパネルをとって(inbox)、減算(sub)して大小を比較。
Aの方が大きい場合(jump_if_neg)、保持していたデータを手元にコピーして(copyfrom)、右側に運ぶ(outbox)
そうじゃない場合(一致している場合も含む)、手元の計算結果に保持していたAを加算(add)してBの値を復元。
copyfromが実行されないように飛ばして(jump)、右側に運ぶ。
これを1セットとして延々と繰り返す(jump)