2021/11/23

ヒューマン・リソース・マシーン 入社28年目−小から大へ

 目次

1)課題

左側の数値3つごとに対し、小さい順に並べ替え、右側に運んで下さい。

2)考え方

3つの数値をA, B, Cとします. 3つの数値の大小関係を調べ, 条件分岐をしていきます.

(1)A<Bの時

A<CならAが最小となる. B<Cなら小さい方からA, B, Cの順になり, C<BならA, C, Bの順になる.

C<AならCが最小となり, 小さい方からC, A, Bの順になる.

(2)B<Aの時

B<CならBが最小となる. A<Cなら小さい方からB, A, Cの順になり, C<AならB, C, Aの順になる.

C<BならCが最小となり, 小さい方からC, B, Aの順になる.

3)もう一工夫

これをそのままコードに落とし込んでいっても良いのですが, コードの見通しが悪くなり, うまく動かないときの対応が難しくなります. そこで, BとCを比較し, C<Bなら, BとCを入れ替えます. つまり, 必ずB<Cであることにして, Aとの比較を考えます. 

(1)A<Bの時

Aが最小となり, B<Cであるから, 小さい方からA, B, Cの順になる.

(2)B<Aの時

Bが最小となる. A<Cなら小さい方からB, A, Cの順になり, C<AならB, C, Aの順になる.

B<Cを保証することで, 大小を比較する回数を減らすことができました. 

4)実装

問題文には予め, 左のコンベアから3枚のパネルを取り出し, カーペットの0番から2番に配置するコードを書いてあります. ここからスタートしていきます. 

まず, カーペットの0番に「A」, 1番に「B」, 2番に「C」,3番に「SWAP」と名前を付けます. C<Bの場合, 「SWAP」と名前を付けたカーペットを使って, BとCのパネルを入れ替えます. ステップ実行して, B<Cの順になることを確認します.

続けてAとBを比較します. 比較結果から, 最小となる値が決まりますので, 最小のパネルを右のコンベアに運びます. なお, 問題文では「小さい順に並び替え」と書いてありますが, 上司は右のコンベアに運んだパネルしか見ていませんので, 放っておいて大丈夫です.

続けて, 分かりやすい方を片付けます. Aが最小と分かれば, 小さい順にA, B, Cと並びますので, その順に右のコンベアに運びます. 25行目のJUMPコマンドは先頭にジャンプさせています. 

次に, Bが最小の場合を考えていきます. まず, 残りのAとCを比較します. 小さい方のパネルを右のコンベアに運ぶところまでコードを書いて, 動作を確認します.

残るは最大のパネルを右のコンベアに運ぶだけです. 35行目と40行目のJUMPコマンドは先頭に戻っています. ここまでできれば, 課題をクリアーできます. 

分かりやすさを優先しましたので, サイズ目標, スピード目標共に達成できていません. 達成するためには, OUTBOXコマンドの使用回数を減らすところから取り掛かると思います. これについては, 原稿を改めます.

目次

0 件のコメント:

コメントを投稿

ヒューマン・リソース・マシーン 入社41年目−並べ替えよ

目次 1)課題 0を終端とした文字列がいくつか流れてきます。各文字列に対してソート(並べ替え)を行い、小さい順(昇順)に右側へ運んでください。 2)状況の確認 この問題では, 予めコードが入っています. このコードを実行して, 何をするコードなのか確かめます.  左のコンベアから...