ヒューマン・リソース・マシーン 攻略 入社35年目 ダブりを省け
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
入力側のデータを出力側に運んでください。ただし、重複したデータは破棄してください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:17行
- スピード:167ステップ
ヒント
その1
考え方は34年目とさして変わらない。
初めからテーブルが存在しているか。自分でテーブルを作るかの違い。
その2
運んだパネルでテーブルを作れば良い。
終端判断は[32年目]と同じ考え方。
回答例 + 解説
サイズ + スピード
回答例 + 解説
1. inbox ラベル2:// テーブルに保持して運ぶ 2. copyto [14] 3. outbox ラベル1:// 1セットの開始位置 4. copyfrom 14 5. copyto idx 6. inbox 7. copyto 13 ラベル3:// テーブルとの比較を繰り返す 8. sub[idx] 9. jump_if_zero:ラベル1へ 10. bump- idx 11. jump_if_neg:ラベル4へ 12. copyfrom 13 13. jump:ラベル3へ // ラベル4 14. bump+ 14 15. copyfrom 13 16. jump:ラベル2へ
考え方自体は34年目と同じ。34年目は初めからテーブル用意されているが、今回は自分で運んだパネルのテーブルを作る。
テーブルは可変長となるが、可変長に対する処理は[32年目]と同じ考え方。
最初のパネル(inbox)は、絶対に重複しないので、即テーブル登録(copyto) + 右へ運ぶ(outbox)
テーブルの最終登録位置(copyfrom 14)を取得して、参照位置を初期化(copyto idx)し、
次のパネルを拾って(inbox)、比較用に一旦保持(copyto)
テーブルの参照位置の内容と比較(sub)して、一致している場合(jump_if_zero)は次のパネルへ
一致していない場合は、参照位置を更新(bump-)して、テーブル範囲を抜ける(jump_if_neg)までパネル(copyfrom)とテーブルの内容の比較を繰り返す(jump)
最後まで一致せずにテーブルを抜けた場合は、テーブルの登録位置を更新(bump+)し、パネルを登録(copyto)してから運ぶ(outbox)