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 件のコメント:
コメントを投稿