この記事では、ヒューマン・リソース・マシーンの私の解答を紹介します。
夫や他サイトさんの解答を見てみると、人によって解き方が違うのが面白かったので、私の解答も記録として残してみることにしました。
注意事項
- あくまでへっぽこ元プログラマーの解答です。←ココ大事
- 効率化目標を達成していないステージもあります。
- もっとよい解き方があるかもしれないことをご承知おきください。
自分の解答とくらべて、
参考にする(なる?)もよし、
鼻で笑うもよし、
違いを楽しんでいただけたら幸いです。
今回は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年目:大は小を兼ねる
手元のデータが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だった時の処理を追加しています。
他のステージの解答
行数の多いステージの画像が見にくくて申し訳ありません。
拡大してなんとか見ていただければと思います。
他のステージの解答は下の記事にまとめています。