ヒューマン・リソース・マシーン 攻略 入社17年目 同じならゼロ
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
左側の数値を2つごとに、判断を行い、2つの数字のプラスorマイナスが同じ場合は「0」を違う場合は「1」を右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:12行
- スピード:28ステップ
ヒント
その1
難しく感じるときはあれこれ考えずに愚直にやるのが実は一番の近道だったりする。
最初のパネルがマイナスの時と、マイナスじゃない時(プラス)の時で、処理を分けて考えよう
その2(スピード目標)
これまた9年目のスピード目標と同じ発想。
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. jump:ラベル1へ ラベル3:// 0を取得 2. copyfrom 4 ラベル4:右に運ぶ 3. outbox ラベル1:// 1セットの開始位置 4. inbox 5. jump_if_neg:ラベル2へ // プラス用処理 6. inbox 7. jump_if_neg:ラベル5へ 8. jump:ラベル3へ ラベル2:// マイナス用処理 9. inbox 10. jump_if_neg:ラベル3へ ラベル5:// 1を取得 11. copyfrom 5 12. jump:ラベル4へ
難しそうで実は簡単。最初のパネルがマイナスの場合、次もマイナスなら0,プラスなら1。
最初のパネルがプラスの場合、次がマイナスなら1,プラスなら0。ってだけ
左のパネルをとって(inbox)、マイナスならマイナス用の処理へジャンプ(jump_if_neg)、プラスならプラス用の処理を実行。
マイナス用処理:次のパネル(inbox)もマイナスなら0(copyfrom 4)、プラスなら1(copyfrom 5)
プラス用処理:次のパネル(inbox)がマイナスなら1(copyfrom 5)、プラスなら0(copyfrom 4)
この時、9年目と同様に無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす。