1)課題
左側の各パネルの文字に対しカーペット上に同じものが何個あるかをカウントし、右側にそのカウント結果を運び出してください。
2)考え方
左のコンベアから取り出したパネルが「X」なら, カーペットに置いてあるパネルから「X」を見つけ, その結果を右のコンベアに運びます. これには, 次の値を管理しなくてはなりません.
- カウントしている値, これを「カウンタ」と呼びます.
- どのカーペットまで調べたかを示すアドレス, これを「アドレス」と呼びます.
- 左のコンベアから取り出したパネル, これを「文字」と呼びます.
「カウンタ」と「アドレス」は0から始めます.
これらの値を使って, 手順を書いていきます.
- 「カウンタ」と「アドレス」を0で初期化する.
- 左のコンベアからパネルを取り出し, 「文字」に配置する.
- 「アドレス」が示すカーペットのパネルを取り出し, 「0」であるか判定する.
「0」であれば, 「カウンタ」の値を右のコンベアに運び先頭に戻る. - 「0」でなければ「文字」のパネルと比較する.
同じであれば, 「カウンタ」を1増やす. - 「アドレス」を1増やし, 3行目に戻る.
3)実装
考えた手順からプログラムを作成します.
カーペットに名前を付け, 「カウンタ」と「アドレス」に0を配置します. また, 左のコンベアからパネルを取り出し, 「文字」に配置します.
「アドレス」が示すカーペットのパネルを取り, 0であるか判定します. 0であれば, カーペットに配置してあるパネルの最後に到達したということです. 0でなければ, 左のコンベアから取り出したパネルと同じかどうかを調べます.
「アドレス」が示すパネルの値が0でない場合の処理を作ります. 7行目のJUMP if zeroコマンドを使ったとき, 「アドレス」が示すパネルを持っていますので, そのまま「文字」に置いたパネルと同じかどうかを判定します.
判定にはSUBコマンドを使い, 同じであればSUBコマンドの結果は0となります. 結果が0, つまり「おなじ!」であれば, 「カウンタ」と「アドレス」を1増やします. 結果が0以外, つまり「ちがう」であれば, 「アドレス」だけを1増やします.
7行目のIF zeroコマンドは, 「アドレス」が示すパネルが0であるかどうかを判定します. 0の場合, つまりカーペットの終端に到達した場合の処理を書きます. 「カウンタ」には「文字」と同じパネルの出現回数が入っていますので, それを右のコンベアに運びます. 運び終われば, JUMPコマンドにより先頭に戻り, 繰り返します.
プログラムを実行するとクリアーできます. サイズ目標を達成できましたが, スピード目標を達成するためにはもう一工夫必要です.
0 件のコメント:
コメントを投稿