ヒューマン・リソース・マシーン 攻略 入社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:ラベル2へ 11. 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)。