目次
1)課題
入力側のデータを出力側に運んで下さい。ただし、重複したデータは破棄してください。
2)考え方
方針は次のようになります.
- 左のコンベアからパネルを取り出し, カーペットに配置していないかを調べます.
- カーペットになければ, 左のコンベアから取り出したパネルをカーペットに追加し, 右のコンベアに運びます.
どのカーペットまでを使ったかを記録するため, カーペット14番にある0を使います. このカーペットに「上限」と名前を付けます.
また, 右のコンベアから取り出したパネルを一時的にカーペットに配置するための場所も必要になります. カーペットの13番に「文字」と名前を付けます.
更に, カーペットに配置してあるパネルの内, どこまで調べたかを記録する場所も必要です. カーペットの12番に「アドレス」と名前を付けます. 「アドレス」は「上限」から始めて, 0に向けて減らしていきます. こうすることで, 使用するコマンドを減らせます.
この問題でよく考えなくてはいけないことは, 最初の1枚をどうするか, です. カーペットに何も無い状態から始めて一般的にプログラムを作れると良いのですが, 「アドレス」の扱いが難しくなります. プログラムを簡単にするために, 1枚目のパネルは特別扱いし, カーペットの0番に配置し, 無条件で右のコンベアに運びます.
3)実装
初期化から始めます.
左のコンベアから1枚目のパネルを取り出し, カーペットの0番に配置します. そのまま右のコンベアに運びます. 続けて, 「上限」の値を「アドレス」にコピーします. 4行目以降のコードを2枚目以降のパネルで使いますので「2文字目」とラベルを付けています.
6行目でINBOXコマンドを使って左のコンベアからパネルを取り出し, 「文字」に配置します. 続けて, 「アドレス」が示す文字と比較し, 同じならそのパネルを捨ててしまうためにそのまま4行目に戻ります. 文字が異なるなら, 「アドレス」を1減らし, 次の文字との比較に備えます.
11行目で「アドレス」がマイナスになっているか判定しています. マイナスであれば, 「文字」は初めて現れた文字ですから, 右のコンベアに運びます. この時, 「上限」を1増やして, カーペットに追加します. OUTBOXコマンドを使うと持っているパネルが無くなりますので, コマンドの順序に注意してください.
「アドレス」がマイナスでない場合, カーペットの次の文字との比較をするため, 改めて「文字」からパネルを取り出し, 8行目に戻ります.
プログラムを実行するとクリアーできます. サイズ目標達成まであと1行です. スピード目標は, 目標値を下回って達成できていました. 1文字目を特別扱いしないコードにすれば, もっと良くなるかもしれません.
目次