プログラミング初心者の子供に何を教えたらいいの?とお悩みの保護者のためのScratch(スクラッチ)の入門講座。Scratchで猫の動かし方はわかったけど・・・次にどんなことをしたらいいの?という疑問にお答えするシリーズです。
今回は「パタトクカシーー」問題のアルゴリズムを考えてみたいと思います。
1. アルゴリズムって何?
プログラミングといえば、アルゴリズムというぐらい切っても切り離せない関係のアルゴリズム。でも、アルゴリズムってよくわかりませんよね。おまけに「」
1-1. アルゴリズムとは?
アルゴリズムとは問題を解くための手順です。今回は「パタトクカシーー問題」を解くための手順を考えます。つまり問題のアルゴリズムを考えるのです。
アルゴリズムは、問題を解くための手順なので一つの問題に対してたくさんのアルゴリズムがあります。そして、アルゴリズムには「良いアルゴリズム」と「悪いアルゴリズム」があります。
良いアルゴリズムの定義は人や時代によって様々ですが、多くの人が以下のような点を挙げています。
・早い
・短い
・わかりやすい
・再利用できる
1-2. 「パタトクカシーー」って何?
「パタトクカシーー」は、ピタゴラスイッチで「ひとつとびぶったいパタトクカシー」というコーナーで紹介されている言葉あそびです。2つの物体(?言葉)が一つ飛びにくっついています。今回は、「パタトクカシーー」をバラバラにして、何と何からできているかをプログラミングで解き明かしたいと思います。
▼ひとつとびぶったい パタトクカシーの項目をご覧ください
ピタゴラスイッチ-Wikipedia
この他にも「サスンリダッルパ」「ハペサンミチ」「ブシャラモシジ」という仲間がいます。
2. 「パタトクカシーー」を分解する
ではここからいよいよアルゴリズムを考えていきたいと思います。
2-1. とりあえず強引に問題を解いてみる
いきなりアルゴリズムがひらめいてどんどん作ってしまう方もいるかもしれませんが、今回は泥臭く一つ一つのステップをやってみたいと思います。
まず、「パタトクカシーー」はひとつとびぶったいなので、言葉の中の文字を一つ飛びに拾っていきます。
そのプログラムがこちら。
プログラムの実行結果はこのような感じになりました。
とりあえずできましたが、再利用ができそうにないのであまり良いアルゴリズムとは言えませんね。
ここから「わかりやすい」「再利用できる」プログラムを考えていきたいと思います。
2-2. 法則を見つける
次のステップは「法則を見つける」です。わかりやすくするために、「●番目(パタトクカシーー)の文字」を取り出して並べてみました。
1, 3, 5, 7 という数字だけが違っていて、あとは同じですね。
では「1, 3, 5, 7」という数字の並びにはどんな法則もしくは共通点があるのでしょうか?これらの数字には「奇数」という共通点があります。
そして、「ひとつとび」つまり「2づつ増える」という法則がありますね。
今回は2つのアルゴリズムが考えられそうです。
①奇数を使ったアルゴリズム
②2づつ増えるを使ったアルゴリズム
2-3. 法則をスクラッチの演算ブロックで考えてみる
まず最初に「①奇数を数式で表す」ということを考えてみたいと思います。奇数は2で割り切れない数=2で割ったときに余りが1になる数です。これをScratchの演算ブロックで表現できるか考えてみたいと思います。
「割った余り」といえばこのブロックが使えそうですね。
何かを2で割ったあまりが1のときに奇数となるので、この「何か」をとりあえず変数「x」としましょう。
「何か(x)を2で割った余りが1」をScratchの演算ブロックで表現してみるとこんな感じになります。
ではこの「何か(x)」は何でしょうか?それは「パタトクカシーー」の文字の順番の●番目です。1番目はパ、2番目はタ、3番目はト・・・という風に数えたときの●番目が「何か」になります。
つまり「何か(x)」は1から順番に増えていって、8で終わる数ということになります。8で終わるのは「パタトクカシーー」の文字数が8文字だからです。
これをScratchで表現すると、こんなプログラムのブロックを使いそうですね。最初はxは0からスタートして1づつ増えて、8で終わり=8より大きくなったらプログラムを止める(すべてを止める)、という意味です。
2-4. 文字をくっつけるプログラムを作る
次に、文字をくっつけるプログラムを作っていきましょう。まずは、「もとの文字列」「ぶったい1」「ぶったい2」という変数を作ります。
もとの文字列には、「パタトクカシーー」を入れます。「ぶったい1」「ぶったい2」は最初は空欄になるようにします。
次に、●番目の文字をぶったい1にくっつけながら入れていくプログラムを作ります。
奇数番目の文字だけが入るようにしたいので・・・「もし●●なら」というブロックを使ってこうします。
このブロックを複製して、ぶったい2には偶数番目の文字が入るようにしましょう。
あとは、これらのパーツをくっつけるだけ!くっつけた後のプログラムはこちらです。
プログラムの結果はこちら。ちゃんと「ぶったい1」と「ぶったい2」に分解した言葉が入っていますね。
こういう考え方は小学生には少し難しいかもしれません。最初はこんな風に解くんだよ、という例を真似させるだけでいいと思います。
2-5. もう一つのアルゴリズムで考える
先ほどは、奇数を使ってアルゴリズムを考えました。今度はもう一つの考え方「②2づつ増えるを使ったアルゴリズム」で今度はプログラムを作り直してみたいと思います。
先ほどのプログラムを少し改造してxが2づつ増えるようにしてみました。
xが2づつ増えるので、2, 4, 6, 8番目の文字がくっついて、ぶったい1には「タクシー」という文字が入りました。このアルゴリズムも使えそうですね。
xが0から2づつ増えると2, 4, 6, 8番目の文字を抜き出すことができました。ということは、1, 3, 5, 7は「-1から2づつ」増えればいいですね。
xという変数はもう使ってしまったので、こんどはyというもう一つの変数を足して「yは-1から2づつ増える」を作ります。完成形がこちら。ぶったい2にはy番目の文字をくっつけながら入れるようにしました。
こちらのプログラムを実行すると、ぶったい1とぶったい2に分解した言葉が入りました。
3. プログラムを仕上げよう
3-1. 他の”ひとつとびぶったい”も分解したい
さて、「パタトクカシーー」には「サスンリダッルパ」「ハペサンミチ」「ブシャラモシジ」という仲間がいます。この仲間も分解できるようにしたいですね。
では最初に①奇数アルゴリズムの方を直していきたいと思います。
変数「もとの文字列」に好きな言葉をいれられるようにします。
さらに、変数xが「もとの文字列」の文字数を超えたタイミングでプログラムが終了するようにしたいので、下の部分もこのように直します。
修正した後のプログラムがこちらです。
では、このプログラムを実行してみましょう。分解したい言葉を聞いてくるので、「ハペサンミチ」と入れてみます。
すると、変数「ぶったい1」と「ぶったい2」に「ハサミ」「ペンチ」という文字列が入りました。
もう一つの「②2づつ増えるを使ったアルゴリズム」アルゴリズムを使ったプログラムも直しておきましょう。こちらを直すとこんな感じです。
3-2. 他の人からみてわかりやすいかチェックする。
さて、ここまでで2種類のアルゴリズムはほぼ完成です。しかし、プログラムは他の人が見ることもあります。他の人が見てわかりやすいかちょっとチェックしてみましょう。
こちらの「②2づつ増えるを使ったアルゴリズム」のプログラムの変数yの初期値が「-1」となっています。これは、1, 3, 5, 7番目の数字を得るために無理やりそうしたのですが、突然「-1」という謎の数字がでてくると、他の人が見たときに混乱する元になりそうです。
そこで、「2づつ変える」プログラムの場所を後ろの方にします。またxとyには、1番目の「1」、2番目の2を最初に入れておきます。これで、少しはわかりやすくなったかなぁと思います。
3-3. スプライトのセリフを作る
最後に、スプライトが分解した文字を言うプログラムを追加して仕上げをしましょう。「②2づつ増えるを使ったアルゴリズム」の方のプログラムにセリフを追加してみました。
このプログラムを実行すると、下の図のようにスプライトがセリフを言います。
4. まとめ
今回は、パタトクカシー問題のアルゴリズムを2つ考えてみました。もしかしたら、これ以外にももっと良いアルゴリズムがあるかもしれません。
アルゴリズムを考えるのは少し難しいと思いますが、次のようなことからまずはチャレンジして見てほしいと思います。
・まずは無理やりでもいいから答えを出してみる
・無理やり出した方法の中から、共通点を見つけ出す
プログラミングには、答えを出す方法はたくさんあります。自分らしい考え方、解き方を考えて、良いアルゴリズムを自分で作ってみてくださいね。