1)課題
左側の数値2つごとに、掛け算を行った結果を右側へ運んでください。この課題では0以上の数値だけが運ばれてきます。
「ラベル」が使えるようになりました。うまく活用し、各場所の用途を忘れない様にメモしておきましょう。
2)掛け算のしかた
この課題では, 2枚のパネルの掛け算をします. パネルには1桁の数字しか書いていないようなので, 九九を習っていれば暗算で答えてしまえます.しかし, ヒューマン・リソース・マシーンの世界で使えるのは足し算と引き算だけなので, これらを使って掛け算をする方法を考えます.
ここで, 例として5×4を考えてみます.足し算を使って5×4を表現すると次のようになります.
5×4=5+5+5+5
つまり, 5を4回足し合わせるということです.
「5を4回足す」に相当するコマンドがありませんので, この計算をもう少し分解します. 5に掛けてある4を1つ減らし, 代わりに5を加えるようにします. 次のように式を変形できます.
5×4=5×3+55×4=5×2+5+55×4=5×1+5+5+55×4=5×0+5+5+5+55×4=5+5+5+5
「5+5+5+5」を計算できれば掛け算の答えが得られるのですが, ヒューマン・リソース・マシーンで「5+5+5+5」を扱う方法が見つからないので, 別の方法を考えます. 「5+5+5+5」と足し算を並べる代わりに, その都度, 5を足しこめば良さそうです.
5×4=5×3+55×4=5×2+105×4=5×1+155×4=5×0+205×4=20
このようにすれば,ヒューマン・リソース・マシーンで使えるコマンドだけで「5×4」を計算できそうです. しかし, プログラムにするためには,上の式の1行目をもう少し丁寧に書く必要があります.
5×4=5×4+05×4=5×3+55×4=5×2+105×4=5×1+155×4=5×0+20
等号の右側には3つの数字が現れています. それぞれの数字にラベルを付けます.
- 5のまま変化しない数字を「A」とします.
- 4, 3, 2, 1, 0と減っていく数字を「B」とします.
- 0から始まって5ずつ増え, 最終的に掛け算の答えとなる数字を「こたえ」とします.
ここまで書ければ, プログラムを作る準備が整いました.
3)プログラムをつくる
上で考えたアルゴリズムからプログラムを作っていきます. この問題から, ラベルを使えるようになりました. カーペットにラベルを付けて, 数字の意味を思い出せるようになります.
カーペットにラベルを付けました.
- カーペットの0番を「A」とします.
- カーペットの1番を「B」とします.
- カーペットの2番を「こたえ」とします.
元々あったラベルの使い方を説明するコードを取り除きます. 左のコンベアからパネルを取り出し, 掛け算をする準備をします. 左のコンベアから取り出したパネルをそれぞれ, 「A」と「B」とラベルを付けたカーペットに置きます. また, 「こたえ」には0を置き, 初期化します.
7行目以降に, 「B」が0になるまで「A」を「こたえ」に足し込むコードを書きました. 図は, 確認のためにプログラムを実行した結果です. プログラムを開始した時, 「B」は4だったので, 「こたえ」が期待通りの20になっています.
続けて, 「B」が0となった時, 「こたえ」を右のコンベアに運ぶコードを追加しました. JUMP if zeroコマンドを実行する前に, COPYFROMコマンドを使って「B」のパネルを持ちます. また, 16行目のJUMPコマンドですが, 図では途切れていますが先頭に戻っています. このプログラムを実行すると, 課題をクリアーできます.
コードを1行減らせばサイズ目標を達成できますが, スピード目標はかなり頑張らないと達成できそうにありません. プログラムを実行している様子を見ていると, 「A」が0の時にも「B」回, 「こたえ」に0を足し込んでいます. 「A」が0なら掛け算の結果も0ですから, もっと工夫できそうです.
0 件のコメント:
コメントを投稿