この記事では、プログラミングパズルゲーム
ヒューマン・リソース・マシーンの、私の解答を紹介します。
夫や他サイトさんの解答と見比べて、
人によって解き方が違うのが面白かったので、
私の解答も記録として残してみることにしました。
注意事項
- あくまでへっぽこ元プログラマーの解答です。←ココ大事
- 効率化目標を達成していないステージもあります。
- もっとよい解き方があるかもしれないことをご承知おきください。
自分の解答とくらべて、
参考にする(なる?)もよし、
鼻で笑うもよし、
違いを楽しんでいただけたら幸いです。
今回は11年目~21年目までです。
他のステージの解答は下の記事にまとめています。
11年目:引き算の結果
手元のデータは、減算結果に上書きされ、
カーペット上のデータは、減算前と変わらずそのまま残ります。
12年目:40の作り方
10年目の応用。
32倍+8倍で40倍を作ります。
カーペットの
0は入力データ、
1は入力データの2倍の値、
2は入力データの4倍の値、
3は入力データの8倍の値、
4は入力データの16倍の値、
を記憶しています。
13年目:同じかどうか
2つの値を引き算して、0なら同じ値だと判断できます。
「copyfrom」と「outbox」を上に持って行き、
最初だけスルー(1行目のjump)させると、
「jump」を通過する回数が減って、スピード目標を達成できます。
14年目:大は小を兼ねる
手元のデータがマイナスの場合、指定の場所にJUMPします。
手元のデータが0以上の場合は、次の行を実行します。
2つの値を引き算して、結果がマイナスか否かでどちらが大きいか判定します。
「add」を使い、2つ目のデータを復元することで
2つ目のデータをカーペット上にコピーする1手を減らせます。
16年目:必ずポジティブに
中学校で習った「負数の引き算」を思い出せるかがカギ。
データがマイナスの場合:1回目のsubで0を作る→1回目のsubでプラスに。
データがマイナスでない(0以上)の場合:そのまま右のコンベアへ。
17年目:同じならゼロ
カーペットの4には0、
カーペットの5には1が入っています。
線がぐちゃぐちゃで見づらいですが、
1つ目のデータを判定した後、
2つ目のデータを判定して、
処理を分岐させているだけです。
1つ目プラス :2つ目プラス → 0
1つ目プラス :2つ目マイナス → 1
1つ目マイナス:2つ目プラス → 0
1つ目マイナス:2つ目マイナス → 1
19年目:カウントダウン
- 「bump +」は、
カーペット上の数字を+1して、手持ちにもコピーする。 - 「bump -」は、
カーペット上の数字を-1して、手持ちにもコピーする。
サイズ目標とスピード目標、別々に達成。
サイズ目標
6行目の「jump if neg」でカウントアップする場合と
カウントダウンする場合で処理を分けています。
スピード目標
最初にデータがゼロか判定をして、ゼロの場合はそのまま出力。
カウントアップ(ダウン)のループを抜ける条件を
negからzeroにして、最後の余分なbumpを通らないようにしています。
20年目:掛け算のしかた
この辺りから効率化目標達成が苦しくなってきました。
サイズ目標のみ達成。
Aに1つ目、Bに2つ目のデータを保管。
AをB回Ansに足しています。
21年目:ゼロが区切り
サイズ目標
スピード目標
1件目が0だった時の処理を追加しています。
他のステージの解答
行数の多いステージの画像が見にくくて申し訳ありません。
拡大してなんとか見ていただければと思います。
他のステージの解答は下の記事にまとめています。