30代SEの自由帳

最初のタイトルは頓挫した

ヒューマン・リソース・マシーン 攻略 入社32年目 同じのはいくつ?

ここで解説している内容なりヒントなりはあくまで筆者の解法に基づいたものなので、別の考え方ももちろんあるよ。ってのは念頭に置いてください。

課題

左側の各パネルの文字対しカーペット上に同じものが何個あるかをカウントし、右側にそのカウント結果を複数の「0区切り文字列」が置かれています。
各文字列を逆から読んだけ結果を、右側に運んでください。

使用可能な命令

  • inbox
  • outbox
  • copyfrom
  • copyto
  • add
  • sub
  • bump+
  • bump-
  • jump
  • jump_if_zero
  • jump_if_neg

効率目標

  • サイズ:16行
  • スピード:393ステップ

ヒント

その1

チュートリアル的な問題。
文字同士も数値と同じように比較できる。

回答例 + 解説

サイズ + スピード

回答例 + 解説

1. jump:ラベル1へ
ラベル2// カウント結果を右に運ぶ
2. copyfrom cnt
3. outbox
ラベル1// 1セットの開始位置
4. copyfrom 14
5. copyto cnt
6. copyto idx
7. inbox
8. copyto 15
9. jump:ラベル5へ
ラベル3// 一致数カウントアップ
10. bump+ cnt
ラベル4// 次のカーペットへ
11. bump+ idx
ラベル5// カーペット上のパネルと比較
12. copyfrom [idx]
13. jump_if_zero:ラベル214. sub 15
15. jump_if_zero:ラベル316. jump:ラベル4

文字同士も数値と同じように比較できる。
あとは問題文をそのまま命令に置き換えるだけ。
毎回カウントや参照位置を初期化することを忘れずに

初期化用の0を取得(copyfrom 14)し、cntとidxを0初期化(copyto)
左のパネルを取って(inbox)、比較用に一旦保持(copyto 15)
idxが指す位置のパネルを取得して、0なら(jump_if_zero)カウント終了し、カウント(copyfrom cnt)を右に運ぶ(outbox) 0じゃなければ、保持していた文字と比較(sub)して、一致していれば(jump_if_zero)カウントアップ(bump+ cnt)
これをカーペット上の0を参照するまで繰り返す(jump)

例によって無駄なジャンプが発生しないようにoutboxとinboxがつながるように配置して、初回の無駄処理(inboxより前)は実行しないように飛ばす(jump)。

  

<前:31年目> <目次> <次:34年目>