Nintendo SwitchのHUMAN RESOURCE MACHINEというゲームで遊んでみた。
プログラミングで社員を動かして、課題をクリアするパズルゲームだ。
課題は、画面左から出てくるデータを、社員が処理して画面右に送り出すというもので、計算や並び替えなど色々な処理が課題として出題される。
社員をプログラミングして動かすのに、アセンブラのような命令を使う。
社員にデータを取ってこさせるimbox命令と、データを送り出すoutbox命令から始まって、データの置き場の床にデータを置くcopyto命令と、データを取り出すcopyfrom命令というのが出てくる。
順番に使える命令が増えていき、データの加工用のadd命令とsub命令や、1を加算/減算するbump命令、ループ処理のためのjump命令と、条件分岐のためのjump if zero命令とjump if neg命令が出てくる。
あと、途中からデータ置き場に間接的に場所を指定して命令が使えるようになる。
これで全部だ。
使える命令が少ないのでつらい。
一応は、最後の並び替えの課題をクリアできた。
37問の課題のうち、36問をクリア済みだ。(41番まで番号があるが、イベント動画のみのマスが欠番になっている)
40番の「素因数に分解せよ」という問題がまだクリアできてなかったりする。(こちらをクリアしなくても41番をクリアすればエンディングとなる。)
クリアするときに、コードの行数と実行時のステップ数も評価される。
コードの行数を少なくするというコードゴルフなパズルと考えると結構難しい。
33個の課題では行数の評価をゲットできたが、残り4個がまだ解けない。
実行時のステップ数は、さらに難しい。
27個の課題で、この評価をゲットしたが、残り10個は全然解けていないし、解けそうな気がしない。
コードの行数を少なくするというのとは逆で、ループを展開して同じ処理を複数回並べて実行したりとか冗長になる。
もうちょっとだけ楽しめそうだ。
—
追記
まだ40番の素因数分解の問題はクリアしていないが、それ以外のほぼ全部の問題でコードの行数を少なくするというのと実行ステップ数についてをクリアできた。
コード行数については、まだ素因数分解の問題が手つかずなのだけど、それ以外はしっかりと全部クリアした。
いくつかの問題はちょっと難しかった。
実行ステップ数についてこのあいだこのエントリを書いたときにはだいぶ残っていて、難しそうだと思っていたのだけど、やってみると面倒くさいだけで割と簡単だった。
41番の「並び替えよ」というソートのプログラムの実行ステップ数がクリアできていない。
単純なバブルソートでは全然ダメなので、セレクションソートに書き換えたのだけど、それでもまだ駄目なようだ。
アセンブリ言語でcallみたいなのが無い命令セットなので再帰の処理とかを書けないから、ヒープソートとかクイックソートとかの方法が使えない。
ちょっと悩み中だ。
全部解けたら、あとで難しかった部分の解法のヒントとかを書いてみようと思う。
—
さらに追記
41番の「並び替えよ」の実行ステップ数の条件もクリアできた。
セレクションソートで初回ループで入力を兼用したり、最終の出力のまとまった処理をしないで確定するつど小まめに出力するようにした。
40番の素因数分解の問題もクリアした。
コード行数については普通にクリアできた。
実行ステップ数が、結構たいへんだった。
素数を決めうちにしたテーブルを最初に作るようにしてみたり、入力値によって12分岐くらいまで分岐させて直接に答を出力したりとか。だいぶ反則なのだけど。
—
難しくて悩んだ問題の解法のヒントのまとめのメモを書いておく。
問題1 簡単なのでヒント不要だと思う。 問題2 実行ステップ数は、ループを使わずに12回処理を並べて書く。 問題3 簡単なのでヒント不要だと思う。 問題4 簡単なのでヒント不要だと思う。 問題5 欠番 デモを見るだけ。 問題6 簡単なのでヒント不要だと思う。 問題7 簡単なのでヒント不要だと思う。 問題8 簡単なのでヒント不要だと思う。 問題9 実行ステップ数は、outboxの位置を変えてジャンプ処理を減らす。 問題10 簡単なのでヒント不要だと思う。 問題11 簡単なのでヒント不要だと思う。 問題12 簡単なのでヒント不要だと思う。 問題13 実行ステップ数は、outboxの位置を変えてジャンプ処理を減らす。 問題14 コード行数10行で、かつ、実行ステップ数は31ステップで済んだ。outboxの位置を変えてジャンプ処理を減らしたり、減算のあと加算をすることで元を数字に戻せるので、保存しないで済ませたりとか。 問題15 欠番 デモを見るだけ。 問題16 コード行数8行で、かつ、実行ステップ数は34ステップで済んだ。outboxの位置を変えてジャンプ処理を減らすので達成できる。 問題17 コード行数12行で、かつ、実行ステップ数は28ステップで済んだ。発生するケースで4つに分岐するようにするのを素直に書けば簡単。 問題18 欠番 デモを見るだけ。 問題19 実行ステップ数は72ステップで済んだ。カウントアップの判定をちょっと工夫してる。コード行数を10行にするのがちょっと難しかった。これもカウントアップの判定をちょっと工夫した。 問題20 コード行数15行は素直に書けば簡単。実行ステップ数98ステップに出来たが、かなり面倒だった。掛け算の掛ける数0~9の10通りに分岐し、それぞれ最小ステップでn倍のコードを書く。 問題21 コード行数10行は素直に書けば簡単。実行ステップ数65ステップに出来たが5個以上のブロックだと破綻するという反則なコードになってしまった。 問題22 コード行数19行は素直に書けば簡単なはずだったが、初期化処理が1つ省略できるのを見落としていた。実行ステップ数126ステップに出来たが。行数最適化する前の素直なコードでも128ステップでクリアできていた。 問題23 コード行数13行は素直に書けば簡単。実行ステップを減らしていたらコード行数が12行で、実行ステップ75をクリアできた。 問題24 コード行数12行は素直に書けば簡単。実行ステップを減らすのにはループ処理部分を展開してジャンプを減らしてクリアできた。 問題25 コード行数12行は素直に書けば簡単。初期化処理をうまく省いてコード行数11行にするのもできた。実行ステップ数82は、ループ内の処理を外に出すなどをしてコード行数11行のままクリアできた。 問題26 コード行数15行で、かつ、実行ステップ数は76ステップで済んだ。素直に書けば簡単。 問題27 欠番 デモを見るだけ。 問題28 素直に書くとコード行数も実行ステップ数もクリアできない。コード行数は入力の処理の3番目の位置を変えたりしてクリアできた。実行ステップ数は、面倒だけど全部のケースの分岐先を作って力技でクリアできた。 問題29 簡単なのでヒント不要だと思う。 問題30 簡単なのでヒント不要だと思う。 問題31 コード行数11行は素直に書けば簡単。実行ステップを減らすのにはループ処理部分を展開してジャンプを減らしてクリアできた。 問題32 コード行数17行は素直に書けば簡単で、コード行数は16行になった。変形させて実行ステップ393をクリアできたが、コード行数が17行になってしまった。 問題33 欠番 デモを見るだけ。 問題34 簡単なのでヒント不要だと思う。 問題35 コード行数17行は素直に書けば簡単、ちょっとだけoutboxの場所を弄って達成した。実行ステップは、バッファ長を6に固定するという反則なコードだけど137ステップでクリアした。 問題36 コード行数39行は素直に書けば簡単で、コード行数は37行になった。0をコピーする処理をさらに1行削って、コード行数36で実行ステップ数109をクリアできた。 問題37 簡単なのでヒント不要だと思う。 問題38 コード行数30行は素直に書けば簡単。実行ステップについては10分岐を2つ書いて162ステップでクリアできたが、183行もの長いコードになり、かなり面倒だった。 問題39 素直に書くとコード行数が15になり、14ステップという条件がクリアできない。割り算の余りの出力の処理を工夫してコード行数14をクリアした。実行ステップはループ処理を展開して67ステップでクリアできた。 問題40 コード行数は素直に書けば簡単。実行ステップ数が、結構たいへんだった。素数を決めうちにしたテーブルを最初に作るようにしてみたり、入力値によって12分岐くらいまで分岐させて直接に答を出力したりとか。だいぶ反則のコードでクリアした。 問題41 コード行数は素直にバブルソートを書けば簡単。実行ステップ数は、かなり大変で、セレクションソートで初回ループで入力を兼用したり、最終の出力のまとまった処理をしないで確定するつど小まめに出力するようにしてクリアした。—
さらにちょっと追記。解法をGitHubで公開しているのがあるようだ。
・GitHub – cowboyhuman-resource-machine-solutions