30代SEの自由帳

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

ヒューマン・リソース・マシーン 攻略 入社39年目 座標をもとめよ

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

課題

左側の数字は、カーペット上の番号を表しています。
各入力データに対し、その座標(x,y)を右側に運んでください。

使用可能な命令

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

効率目標

  • サイズ:14行
  • スピード:76ステップ

ヒント

その1

0 = 0,0 3 = 0,3 5 = 1,1 11 = 2,3

これまでのお仕事で実施した計算の中に同じ結果になるやつがある

その2

5 / 4 = 1 余り 1
11 / 2 = 2 余り 3
xが4毎にyが1カウントアップされるので、単純に4で割った商=y、余り=xになる。

回答例 + 解説

サイズ + スピード

回答例 + 解説

1. jump:ラベル1// ラベル2:結果を運ぶ
2. add 15 // 減算した値を加算することで元の値を復元
3. outbox
4. copyfrom y
5. outbox
ラベル1// 1セットの開始位置
6. copyfrom 14
7. copyto y
8. inbox
ラベル3// x,y座標算出
9. sub 15
10. jump_if_neg:ラベル211. copyto 0
12. bump+ y
13. copyfrom 0
14. jump:ラベル3

xが4毎にyが1カウントアップされるので、単純に4で割った商=y、余り=xになる。
割り算は24年目,26年目で実施済み

初期化用に0を拾って(copyfrom 14)、yを初期化(copyto y)
パネルを拾って(inbox)、4で割り算を実施(sub 15 ~ jump)
割り切れなくなったら(jump_if_neg)、減算前の値を加算(add)することで元の値を復元し、余り(=x)を運び(outbox)
商(=y)も同様に運ぶ(copyfrom -> outbox)

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

  

<前:38年目> <目次> <次:40年目>