始める小学生からのプログラミングスクラッチで日本情報オリンピックのプログラミングに挑戦(文字列処理編)みなさま、こんにちは。今回は、前回の内容に引き続き、情報オリンピックの問題をスクラッチでやってみました。前回の記事では簡単な問題を取り上げていたので、プログラムで計算しなくてもすぐに答えが出せるレベルの内容でしたが、今回の問題は、プログラムを使わないと回答を導くのに時間がかかってしまう内容になっています。ある.問題の整理この問題ですが、問題の意味を理解するのが最初の山場かもしれません。ターゲットになった人を当てるというゲームですが、次の条件があります。ターゲットは、JOI君(ゲームとは関係のない人)が、(予想できないように)無作為に決めてその人に伝える。(同じ人がターゲットになる可能性もある)ターゲットとなった人は、自分自身の名前を書くそれ以外の人は、予想して書く予想が当たれば1点、外れた人は0点。(そのため、ターゲットとなった人は必ず1点は取れる)ターゲットとなった人は、予想が外れた人数分の点数の得点を更に得ることができる入力となるデータとしては、次のとおりになっています。ゲームの参加人数Nゲームの回数Mそれぞれの回のターゲットの番号それぞれのゲームにおいてそれぞれの人が予測したターゲットの番号この手の処理をするときは大まかに次のような流れになります。入力データを読み込む入力データに従って、それぞれのゲームを施行し、得点を計算する結果を書き出す結果を書き出す部分はスクラッチでは、リストにデータを書き込む以上のことができないので、次以降は、1,2に関してそれぞれ書いていきます。入力を読み込む入力を読み込んでそれぞれのデータを取得する部分が、実は一番スクラッチで向いていない不得意な部分です。もとの問題のように、CやC++などの言語を使う場合は、文字列を処理するためのライブラリが存在しています。そのため、ライブラリを使うことで取得したい文字を抜き出すのは比較的簡単です。ところが、スクラッチは文字列を処理するための機能が殆どありません。そのため、効率が少々悪い方法で文字を拾っていくしか方法がないのです。具体的にどのようにするかを次に述べます。スクラッチで使うことができる、文字列処理のブロックは次の3つです。書かれたブロックになります。長さ」そのため、入力された文字を1文字ずつ読み出し、それぞれが数字か空白かを判定して、値を取り出す処理を書くことになります。簡単に書くと次のようになります。次の文字を見るこれは、いわゆる文字列処理の典型的な方法なのですが、1文字ずつ読み込んでその文字がどういう文字かで処理を変えるというものです。実際に、ターゲットのデータを読み出す処理はスクラッチで書くと次のようになります。それぞれのゲームを施行し、得点を計算それぞれのゲームを施行する場合は、先程述べた条件の中で、次の2つの内容に留意する必要があります。予想が当たれば1点、外れた人は0点。(そのため、ターゲットとなった人は必ず1点は取れる)ターゲットとなった人は、予想が外れた人数分の点数の得点を更に得ることができる予想が当たるということは、ターゲットの番号と同じ番号であることを意味合します。そのため、次のような処理になります。正解数)を足す実際に得点計算をする部分は次のようになります。文字を読み込んだ直後に、それぞれの人の予想があっているかどうかをその都度判定し、結果を格納しています。これは極力繰り返しの回数を減らすために、そのようにしています。まとめ実際にスクラッチで実行させてみると、たしかに計算できることは確認できるのですが、入力として用意されているデータを読み込み、動かす場合、スクラッチの文字列処理のスピードが遅く、たいへん時間がかかる処理になってしまっています。入力データを1文字ずつ読み込まないといけないのが処理のボトルネックになっています。CやC++でも本質的な部分は大きく変わらないものの、ビジュアルで見せているスクラッチと比較して、一つ一つの処理が大変軽いため、Cなどのプログラミング言語を使ったほうが処理時間は断然早いです。そのため、スクラッチでこの手の問題をやるのは無理があると思います。基礎的な考え方を理解する上で、ビジュアルプログラミングで試せるというのは、それはそれで参考になるのではないかと思い、書いてみました。対象としたプログラミング&ロボット教室を開校しています。コース概要のページで説明しております。創造性や協調性などこれからの時代に必要となる素養を育てるコースです。ご興味ありましたらぜひお問い合わせください。授業運営パッケージ弊社で実施している授業を取り入れたい方々向けに提供しています。