ヒューマン・リソース・マシーン 攻略 入社31年目 文字列を逆に
ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。
課題
複数の「0区切り文字列」が置かれています。
各文字列を逆から読んだけ結果を、右側に運んでください。
使用可能な命令
- inbox
- outbox
- copyfrom
- copyto
- add
- sub
- bump+
- bump-
- jump
- jump_if_zero
- jump_if_neg
効率目標
- サイズ:11行
- スピード:122ステップ
ヒント
その1
逆に運ぶこと自体は[4年目]で実施済み
違いは固定長だったのが、可変長になっていること
文字の長さはどうやって計る?
その2
文字の長さはカウントアップで計る。
その3
必要な文字を全部運び終わった後、カウンタ(間接指定位置)はどこを指している?
回答例 + 解説
サイズ + スピード
回答例 + 解説
ラベル1:// 1セットの開始位置 // 区切りまでのパネルをカーペットに並べる 1. bump+ 14 2. inbox 3. jump_if_zero:ラベル2へ 4. copyto [14] 5. jump:ラベル1へ ラベル2:// カーペットの内容を右に運ぶ 6. bump- 14 7. jump_if_zero:ラベル1へ 8. copyfrom [14] 9. outbox 10. jump:ラベル2へ
0までのパネルをカーペット上に並べて、並べたパネルの終端から順番に運ぶだけ。
パネル毎にカウントアップすることで、文字の数も取れるし、自然とカーペットの保持する位置もずれていく。
※これまで触れてこなかったけど、この[間接指定]はポインタって概念。
そして今回のように整列されたポインタは配列(及びインデックス)って概念。(配列の方が簡単だからプログラミングを覚えるときは配列から覚えることになると思う(蛇足))
↑の概念は特に覚えなくても問題なし。
また終端の位置も必然的に取れているため、あとはカウントダウンしつつ右側へ運ぶだけ。
この時、毎回1で始まって0で終わるように、カウントアップはinboxする前に実施する
初回カウントアップ(bump+)してから、左のパネルを取って(inbox)、0なら(jump_if_zero)並べられているパネルを運ぶ
0じゃなければ、カウンタの位置に保持(copyto)して、0になるまでパネルを並べ続ける(jump)
パネルを運ぶ:
カウンタは最後のパネルを置いた位置の次の位置を指しているため、カウントダウン(bump-)して参照位置を合わせて、
カウンタが0になる(jump_if_zero)まで、カウンタの位置のパネル(copyfrom)を右側へ運んで(outbox)はカウントダウンしてを繰り返す(jump)