まさはる's Weblog

まさはる's Weblog
Macintoshとオーディオの話題

2018年11月24日

Human Resource Machine

Category : Game 6 / Posted at 2018年11月24日 17:21

 新作が出たからかSteamで値引きされていたので購入してやってみたTomorrow CorporationHuman Resource MachineのMac版の話題です。

タイトル画面
Human Resource Machine

 このゲームは、入社して定年まで、上司から与えられた仕事をこなしていくゲームです...大体合っているけど正しくは、プレイヤーが書いたプログラムに従って社員が動き、上司から与えられた課題をこなしていくというゲームです。

ゲーム画面
左のコンベヤの物を加工して、右のコンベヤに乗せるのが仕事です

 上の絵の右側のリストに、課題に応じて命令をドラック・ドロップしてプログラムを組んでいきます。プログラムで使用できる命令はアセンブラのような簡単なものばかりで、レジスタ代りのカーペットを利用して計算します。

仕事の目標
プログラム行数とステップ数の目標があります

 プログラム行数とステップ数は別々に評価されるので、プログラム行数を小さくしたプログラムと、ステップ数を小さくしたプログラムをそれぞれ作って評価してもらうことができます。なお、目標に達しなくても、答えを出せれば先に進めます。

命令の解説
jump if negative命令の解説

掛け算
掛け算中

 掛け算の a x b は a を b - 1 回足し算すれば答えが出ます。割り算の a / b は a から b が何回引き算できるかカウントすれば答えになり、引き算できなかった残りが余りです。掛け算と割り算をする命令はありません。

エレベーター
エレベーターのスイッチ

 上の階に行くほど課題が難しくなります。途中にコーヒーブレイクが何回かあるのですが...。

コーヒーブレイク中
コーヒーブレイク中

コーヒーブレイク中
会社の外では大変なことになっている様子...

 上の絵を見ただけでは平和そのものですが、会社の外は謎すぎる状況になっていきますw。ちなみに、上の2つの似たような絵は別々のコーヒーブレイクで、一方ではビルが壊れる音と悲鳴が...。

終盤の課題
何があったのか分かりませんが、ビルの一部が壊れています

プログラムミス
プログラムはどんな入力データにでも対応できることが必要です

 違う入力データを入れると違った動作になるプログラムを作ると、上の絵のようなメッセージが出ます。この場合、クリアした事にはならないので、プログラムを修正する必要があります。

素因数分解
素因数に分解中

 エリートコースの終盤に出てくる素因数分解ですが、解き方が分からないので、上の絵のように2から29までの素数のテーブルを作って、小さい素数から順番に割り算をして、割り切れるかどうか判定して答えを出すというプログラムを作りました。プログラム行数とステップ数の目標からかなり外れているので、もっといい解き方があるんでしょうね。
 ちなみに、素因数分解については上司が教えてくれますが、16だと 2 x 2 x 2 x 2、17だと17、18だと 2 x 3 x 3 というように、値を素数の掛け算に分解する事です。

 パズルゲームと言ってしまえばその通りなのですが、中身はアセンブラのようなプログラミングゲームで、かなり面白いと思います。プログラムを書いたことがなくても、ゲームの順に解いて行けば大丈夫だと思います。

(その後...)

上司と会話中
上司と会話中...

上司と会話中
完璧な仕事人間の上司

 たまたま上司と会話をしてみたら上のような会話に。どうりで、会社の外が大変な事になっているにも関わらず、定年まで普通に仕事ができるわけですねw。

 話変わって、プログラム行数とステップ数の目標クリアについてはついつい熱くなってしまいがちですが、ゲームの中でも書かれているように、ほどほどでやめておくのが無難です。プログラム行数を減らすと非効率に、ステップ数を減らすとプログラムの行数が増えて読みにくくなる場合があります。

掛け算のしかた
入社20年目にしてする初めての掛け算の仕事...プログラム行数を減らしたサンプル

掛け算のしかた
上と同じ掛け算で、ステップ数を減らしたサンプル

 上の2つの絵のプログラムは、それぞれの目標クリアはできますが欠点があります。足して2で割ったぐらいが適当だと思います。

(更にその後...)

 足して2で割ったぐらいが適当とか言っておいて、ついつい熱くなってしまっている今日この頃、入社28年目の「小から大へ」は、3つのデータを小さい順に右に移すというものですが、プログラム行数とステップ数の目標クリアが厳しくてかなり難しいです。

エレベーターのスイッチ
入社28年目の「小から大へ」は青色スイッチの最後です

 プログラム行数を減らすためには、3つのデータを比較して小さい順に並べ替え、最後に順に右に移していく方法がいいと思います。ステップ数を減らすためには、3つのデータを比較していき、順序が判明次第、6パターンある右に移すルーチンに飛んで処理する方法がいいと思います。
 プログラム行数の方はなんとかクリアしたのですが、ステップ数のクリアが難しい...。ステップ数の目標が78のところ、79ステップ。あと1ステップが縮まらない。

プログラム
最後にjumpさせないようにしたところ...

目標の評価
これでやっと78ステップに納まりました

 アセンブラで組む必要のあるプログラムだと、処理速度に直結するステップ数を減らしたプログラムを書ける事が重要なのでしょうね。最近は高級言語で分かりやすい悠長な書き方しかしていなかったので、目標クリアはかなり大変です。

このページのトップに戻る