Human Resource Machine

Human Resource Machine

27 ratings
Human Resource Machine 攻略ヒント(と答え)
By No Money No Honey
詰まりやすいステージのヒントおよび解答例
6
   
Award
Favorite
Favorited
Unfavorite
はじめに
私がこのガイドを書こうと思ったのは、「ヒューマン・リソース・マシーン 攻略」だとか「human resource machine 攻略」とかでググると、答えを書いたページばっかり引っかかるからだ。
違うでしょ。

パズルゲームってのは、自分で解くから楽しいんですよ。
解けなくて攻略方法をググるのは、「ヒント」がほしいからであって、答えそのものが知りたいわけじゃない
まあ、どうしても解けなくて答えがほしい!ってときもなくはないけどさ。

だから、ここにはヒントを書くことにした(ヒントが不要そうなものは除外)。
どうしてもわからん!という人のために答えも用意してあるが、pastebin へのリンクになっている。
ホントは黒塗りにしようと思っていたのだが、黒塗りだとコピペできないようなので。

あ、もちろん答えは「これがベスト!」なんて云うつもりは全くない。
なんたって私はプログラミングのプの字も知らない素人なのだ(でも全実績は取ってますのでご安心を)。
すべての問題に共通するヒント
このゲームは、ただクリアするだけでなく、コードを最適化しようというやりこみ要素がある。
最適化の方向性は 2 つ。
「コードを短くする」のと「コードの実行回数を少なくする」というものだ。

前者を達成したい場合は、似たような手順を可能な限りまとめるのがコツ。
何度も同じコマンドを使っている箇所なんかはかなり濃厚な削減対象だ。
後者は、細かく場合分けするのとループさせる必要がなければさせず、必要な手順をいちいち書くのがコツ。

最適化に臨む場合は、いつもこれらを頭に入れておくとよい。
Year 2: 忙しい運び屋さん
素直にやるとスピード目標が達成できない。
スピード目標を達成するには不要な行動を削る必要がある
そして、スピード目標を達成する際、必ずしもサイズ目標を満たしている必要はない。
不要な行動、あるよね?

答え[pastebin.com]
Year 9: ゼロだけを残せ
普通にやるとスピード目標が達成できない。
となると、不要な行動を探さなくてはならないのだが、これを見つけるのは難しいのでズバリ書く。
ゼロのときのジャンプ回数が 1 回になるようにすべし。
発想の転換が必要。

答え[pastebin.com]
Year 10: 3 回で 8 を
2 の 3 乗は 8

答え[pastebin.com]
Year 12: 40 の作り方
Year 10 の発展型。
あとは2 の 5 乗が 32であることを知っていれば解けるはず。

答え[pastebin.com]
Year 13: 同じかどうか
素直にやるとスピード目標が達成できない。
でもこれ、過去に同じようなのがありましたよね。
具体的には Year 9 に。

答え[pastebin.com]
Year 14: 大は小を兼ねる
2 つの数字のうちどちらかを出さなくてはならないからといって、両方キープしておく必要はない
最初の数字だけキープしておけば充分。

答え[pastebin.com]
Year 16: 必ずポジティブに
普通にやってもスピード目標は満たせるはず。
行数で削るべきなのは、もちろん 2 つあるあいつ
2 つなきゃいけないやつもある。でもおまえは 2 つ要らないよなあ?

答え[pastebin.com]
Year 19: カウントダウン
素直に組めばサイズ目標は達成できると思う。
スピード目標を達成するには、0 の運び方を工夫するように考えるのがよい。

答え[pastebin.com]
Year 20: 掛け算のしかた
掛け算は足し算の省略であることがわかっていればできる(2×5 は 2+2+2+2+2 だ)。
サイズ目標も簡単に達成できるだろう。

スピード目標達成のためには、掛け算の回数を減らす工夫が要る。
具体的には注意すべきなのは、「0 の掛け算」、「1 の掛け算」、「掛け算の順序」の 3 つ。

最も細かく場合分けしたときのコード[pastebin.com]はえらく長くて汚いものになってしまった。
これ、もうちょっと短くできる人がいたら教えてください。
Year 21: ゼロが区切り
説明がちょっと不親切で、空の文字列をどう処理すべきかがいまいち明確でない。
空の文字列が来たら 0 を出すのが正解。

3, 8, 0, 0, 7, 0 と来た場合、0 は区切り文字だから、3, 8 | 空 | 7 | と読む。
だから出す数値は 11, 0, 7 になる。
難しいのは、空の文字列が連続で来る箇所で、そこさえできればあとは簡単。
最適化も苦労しないはず。

答え[pastebin.com]
Year 22: フィボナッチ数列
上司の説明が少し意地悪。
例えば 19 が来た場合、出すのは 1, 1, 2, 3, 5, 8, 13 の 7 つだが、7 つとも床に置いておく必要はない
もしその 7 つを床に置くようなプログラムを書いていたら、どうやってその 7 つを作ったかもう一度よく考えよう。
はっきり云うと、床に置くのは リセット用の数を除けば、2 つで充分

答えその 1[pastebin.com]

最初に 7 つとも床に置く必要はないと書いたが、ステップ数を削りたければ、あらかじめ 21 まで床に置いておくほうがよい(22 以上の数字はこの問題では出ない)。
その代わり、行数はかなり大きくなるし、22 以上の数値が出ないとわかっているから許されるだけで、汎用性はない。

ステップ数に特化した答え[pastebin.com]
Year 23: 一番小さいのは?
結局、その時点での最小値さえわかっていればいい。

答え[pastebin.com]
Year 24: あまりはいくつ?
Year 20 と似たような問題で、割り算が引き算可能な回数を調べるものだと知っていればできる。
Year 26 ではその回数を調べさせられるが、こちらはあまりさえわかればいいのでより簡単。

答え[pastebin.com]
Year 26: 割り算のしかた
スピード目標を達成するには、1 つ目の数が 0 だった場合の処理をどうするか考えるとよい。

答え[pastebin.com]
Year 28: 小から大へ
クリアだけならそう難しくはないはず。
難しいのは最適化。
それぞれ違った方向性で考えるのがよい。
ポイントは床に置いた数字の並べ替え
床に置いた数字を並べ替えてしまうと、出す際のコードが統一できず、行数が増えてしまう。
その反面、並べ替えなければ、並べ替える手間は省ける。

サイズ目標を満たすには、並べ替えを駆使して比較およびアウトプットのコードを可能な限り統一できるように考える。
スピード目標を満たすには、並べ替えはせず、どの順に並んでいたとしても昇順で出せるようなコードを書けばよい。

サイズ目標、答え[pastebin.com]
スピード目標、答え[pastebin.com]
Year 31: 文字列を逆に
サイズ目標を達成するためには、bump + と bump - が 1 回ずつしか出てこないコードを意識しよう。

答え[pastebin.com]
Year 35: ダブりを省け
サイズ目標は普通にやっても達成は難しくないはず。
スピード目標達成には間接指定を使わないコードを考えるのがいい。
更に云うと、この問題は A, B, C, D, E の 5 文字しか出てこないので、床にその 5 つが出た時点で終わりにしてしまっていい

答え[pastebin.com]
Year 36: 辞書順に並べよ
ストレートに解こうとすると、考えるべきことは非常に多くなる。
under と unite のような単純な場合だけでなく、unit と unite、unit と under、under と un のように文字数が異なる場合でも正しく判定ができなくてはならない。
文字数をチェックするだけでなく、どうやって比べていくかにも気を配ろう。

が、最適化のためにはそういう発想は捨ててしまってよい。
出すべき文字は何なのかをきちんと考えよう。
それさえ出せればいいのだ。
例えば、2 つ目の単語を床に置く必要はない

答え[pastebin.com]
Year 38: 数字をバラせ
サイズ目標の達成は難しくないはず。
スピード目標を達成するには、sub や bump をループ処理しないのがポイント。

答え[pastebin.com]
スピード特化の答え[pastebin.com]
Year 39: 座標をもとめよ
1 段下がると数字は 4 増えることを使って座標を割り出す。
Year 24 と 26 が類似問題。
ズバリ云うと、4 で割ったときの商とあまりがそれぞれ Y と X

答え[pastebin.com]
Year 40: 素因数に分解せよ
真面目に素因数分解するコードがうまく書ければ、サイズ目標は達成できる。
素因数分解は、「どの素数で割れるか」を調べるのだが、素数でないものについても調べると手順を統一でき、すべてループで処理できるようになる。
なぜそれでも問題ないのかはちゃんと考えればわかるだろう。

スピード目標を達成するためには、ちょっとしたズルをする。
この問題、2 ~ 20 までの数字しか出てこない
例えば、複数回アウトプットする可能性がある素数は 2, 3, 5, 7 の 4 つだけだから、床に置くのはその 4 つで充分。
汎用性はないが、ステップ数は大幅に削減できる。

サイズ目標、答え[pastebin.com]
スピード目標、答え[pastebin.com]
Year 41: 並べ替えよ
バブルソートアルゴリズムでググれ。
と一言で済ませてしまうとガイドでもなんでもなくなってしまうので、もう少し書く。

要は、自分より左に自分より小さい数字があるかどうかを調べればよい。
例えば、B, R, A, I, N の 5 文字が来たとする。
N から調べていって、N だめ、I だめときて、A は自分より左に自分より小さいものがない。
そしたら、A を出せばよい。
あとは空席になった A の場所をどう処理するか思いつけば、解ける。

答え[pastebin.com]