2021/02/26

6. 数学は強力だけど、Scratch でとりあえず調べてみる。

1. 数字を小さい順に並べてできる 4 桁の数の個数

  以前、数字を小さい順に並べてできる 4 桁の数の個数は 715 個と書いた。
 1万個もある 4 桁の数 のうち、たった 715 個しかないのは驚き。

 そこで前々回(第4回)、715 個しかないのを確かめるためのプログラムを
 スクラッチで作り始めた。

   8. 準備ができたので、まず 0000、0001、・・・ 、 0009 を数えてみよう。
  13. つぎは、0000 から 0099 まで数えてみよう。

 ここまでは、プログラムを作って、動かしてみたと思う。

  14. では、0000 から 9999 まで数えてみよう。これは宿題。
  15. 0000 から 9999 までの数で、
   右となりの数字が同じか大きくなっている数を数えるのは
   どのようにしたらよいだろうか。これも宿題。

 これらの宿題の説明はまだだけど、前回は
 数字を小さい順に並べてできる 2 桁の数の個数を数えるプログラムを作った。
 数学の公式を使うとプログラムで数えなくともよいことがわかった。

 今回はまず、上記の 14. の宿題 0000 から 9999 まで数える から説明する。

 プログラムには、次のように動作をさせたい。

    a b c d カウンター
    0 0 0 0     1
    0 0 0 1     2
    0 0 0 2     3
    ...
    0 0 0 9    10
    0 0 1 0    11
    ...
    0 0 1 9    20
    0 0 2 0    21
    ...
    0 0 8 9    90
    0 0 9 0    91
    ...
    0 0 9 9   100
    0 1 0 0   101
    ...
    0 1 9 9   200
    0 2 0 0   201
    ...
    0 9 9 9  1000
    1 0 0 0  1001
    ...
    1 9 9 9  2000
    2 0 0 0  2001
    ...
    8 9 9 9  9000
    9 0 0 0  9001
    ...
    9 9 9 9 10000

 これは数式では、のように表される。

 そこで、 2 桁の数の個数を数えるスクラッチのプログラムを参考に、
 以下のように、4桁の数の個数を数えるプログラムを作る。


 これらをつなげると、

 のようになる。数式と似ている。
 プログラムは動かすとかなり時間がかかる。数式では、
 のように計算できる。

 つぎに、15. の宿題 
   0000 から 9999 までの数で、
   右となりの数字が同じか大きくなっている数を数える
 を説明する。

 前回、「2 桁の数で、右となりの数字が同じか大きくなっている数の個数」を
 数えるプログラムを、プログラムの中の「d を 0 にする」を 「d を c にする」に
 変えて作った。
 これはに変えたのと同じ。
 このようにすると、c の右となりの数字 d が同じか大きくなる。したがって、
 4 桁の数で、右となりの数字が同じか大きくなっている数の個数を数えるには、
 を計算すればよい。しかし、この計算はちょっと難しい。
 そこでとりあえずスクラッチのプログラムで数えてみよう。

    a b c d カウンター
    0 0 0 0     1
    0 0 0 1     2
    0 0 0 2     3
    ...
    0 0 0 9    10
    0 0 1 1    11
    ...
    0 0 1 9    19
    0 0 2 2    20
    ...
    0 0 8 9    90
    0 0 9 9    55
    0 1 1 1    56
    ...
    0 1 9 9   100
    0 2 2 2   101
    ...
    0 9 9 9   220
    1 1 1 1   221
    ...
    1 9 9 9   285
    2 2 2 2   286
    ...
    8 9 9 9   714
    9 9 9 9   715

 先ほどの 4 桁の数を数えるプログラムの
  「b を 0 にする」を 「b を a にする」に、
  「c を 0 にする」を 「c を b にする」に、
  「d を 0 にする」を 「d を c にする」に
 に入れ替える。

 
 このプログラムのなかの「0.1 秒待つ」を削除すると、すぐに数え終わり、
 4 桁の数で右となりの数字が同じか大きくなっている数の個数が 715 個である
 ことがわかる。

 の計算については、次回以降に説明する。

2. スクラッチの簡単なプログラム

 スクラッチで足し算練習問題出題プログラムを作ってみよう。


  1. a+b=c の a と b に 1 桁の数が表示され、
  2. 計算結果をキーボードから入力すると、c にその値が表示される。
  3. 足し算の結果と入力した数が合っていれば、「正解です!」と表示する。
  4. 上記を10回繰り返し、何問正解したかを表示する。

 上記の + や = は、スプライトを編集して作る。


 この筆の印の場所をクリックすると、スプライトと言う図柄を作る編集の画面が
 中央に現れる。


 T を選択し、キーボードから + の記号を入力する。
 矢印を選択し + の大きさと位置を調節する。


 = のスプライトも同じように作る。

 スクラッチのプログラムは以下の通り。


 これを分解してみる。


 この部分は10問出題し、正解の数を p に蓄え、最後に正答数を表示する。


 この部分は乱数を用いて、1 から 9 までの数を a と b に入れる。
 0 から 99 までの乱数にしたり、4桁や5桁の乱数にすることもできる。


 この部分は計算式を表示し、キーボードからの入力を待つ。
 入力結果を c に入れる。


 この部分は a+b の値と入力した答え c が同じか調べ、
 同じときは「正解です!」と表示し、正答数を数える p に 1 加える。

 このプログラムをすこしかえたものや、引き算、掛け算、割り算、分数の計算の
 問題を出題するプログラムを、スクラッチのホームページ上に共有で公開した。


2021/02/19

5. スクラッチでも時間がかかることを、何とか楽に!

1 数学語は便利!
  先週は、スクラッで数字 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 の数を数えた。
  数えなくても 10 個あることは分かっているが、
  スクラッチのプログラム

  は次のように数字の数を数えていた。

      d:  0 1 2 3 4 5 6 7 8 9 10
     個数:  1 1 1 1 1 1 1 1 1 1
  カウンター:0 1 2 3 4 5 6 7 8 9 10

  スクラッチのこのプログラムを実行すると、上に書いたように、
  まじめに一つひとつ数える。

  しかし、数学ではそんなめんどうなことはしない。

  めんどうなことをせずに済ますために、ちょっとめんどうな準備をする。

  「10 個の 1 を足し算すれば 10 になる」ことは分かっている。
  変数 n を使って一般的に書くと、「n 個の 1 を足し算すれば n になる」。

  これを数学語では 、つまり、数式では

  と書き、意味は
  である。
  
  n がどんな数でも n 回の足し算をせずに、この和は n である。

  そこで公式として
  を覚えておくと便利に使うことができる。

  上のプログラムで、
   d を 0 にする
  を
   d を 4 にする
  に変えるとどうなるだろうか。

      d:  4 5 6 7 8 9 10
     個数:  1 1 1 1 1 1
  カウンター:0 1 2 3 4 5 6

  このときは、4 から 9 までを一つひとつ数えて 6 個になる。

  数式では

  のように和が得られる。
  変数 c を使って、c から 9 までの個数は 

 
  と書くことができる。

2. 2桁の数で、右となりの数字が同じか大きくなっている数の個数

  先週、「13. つぎは、0000 から 0099 まで数えてみよう。」 で
  次のスクラッチのプログラムを示した。

これを分解すると次のようになる。

中央の d の繰り返しの 「1 という」の部分にその右の 「カウンターを 1 ずつ変える」の
ブロックが入り、数式では
 と表すことができる。

左の c の繰り返しの「d の繰り返し結果 と言う」の部分に中央のブロックを入れると、
数式では
のように表される。

  このプログラムの中の「d を 0 にする」を 「d を c にする」に変える。


  これは次のように動作する。

   d 0 1 2 3 4 5 6 7 8 9 10   カウンター
  c                             0
  0  1 1 1 1 1 1 1 1 1 1 (=10) 10
  1    1 1 1 1 1 1 1 1 1 (= 9) 19
  2      1 1 1 1 1 1 1 1 (= 8) 27
  3        1 1 1 1 1 1 1 (= 7) 34
  4          1 1 1 1 1 1 (= 6) 40
  5            1 1 1 1 1 (= 5) 45
  6              1 1 1 1 (= 4) 49
  7                1 1 1 (= 3) 52
  8                  1 1 (= 2) 54
  9                    1 (= 1) 55

  このスクラッチのプログラムは、この和を一つひとつ数えている。
  数式では
  と表される。c に対して
  であったので、d についての繰り返しの部分は、
  「カウンターを 10-c ずつ変える」に置き換え、
  とすることができる。

  これを数式で書くと、
  と表される。

  これは 1 から 10 までの数を一つひとつ足し算をすることを表しているが、
  足し算をせずに以下のように考えることができる。

  変数 n を使って一般的に書くと、
  のように n-1 回の足し算が、足し算1回、掛け算1回、割り算1回の計算になる。
  公式として
  を覚えておくとよい。

  n が大きな数のときは、スクラッチのプログラムでは大変時間がかかるが、
  数学の公式を使うと楽に和を求めることができる。

  めんどうなことはしたくない。数学は便利だなあ。

3. よんすうパズルを出題するスクラッチのプログラム

  スクラッチの乱数を生成する機能を使うと、
  よんすうパズルの問題を作ることができる。

  a. 変数 a, b, c, d, t を作り、
   実行画面の上のほうに a, b, c, d を左から横1列に並べる。
   その下に t を置く。


  b. スプライトの大きさと位置 x, y を次のようにする。


  c. プログラムを以下のようにする。


  このプログラムは出題をするだけで、
  どのように解いたかをプログラムに知らせることはできない。
  合っているか違っているかの判定もできない。
  解がわからないときの正解例を表示することももちろんできない。
  でも、切符や、自動車を見なくても、よんすうパズルを楽しむことができる。

  このプログラムを少し変えたものを、スクラッチのホームページ上に共有で公開した。

4. おまけ

  どのように解いたかをプログラムに知らせ、
  合っているか違っているかを判定する
  スクラッチのプログラム yonsu-puzzle を作成した。
  これは、正解例を表示することはもちろんできない。

  スクラッチのホームページ上に共有で公開した。

2021/02/13

4. めんどうなことはしたくないが

よんすうパズルになれてきましたか?

ひらめきでわかるときは楽しいが、むずかしい数の列だとチョットたいへん。
最後の計算から考え始めて、すぐにわかれば、大進歩。
少しむずかしい問題も解けるようになった。

でも、かなり難しい問題は、最後の計算から、場合分けをしながら、
順番に考えるのはたいへんめんどう。

めんどうなときに、なんとか楽できないかと考えてきたのが人の歴史。
なんとかさぼりたい。

あきらめるのも一つの方法。
でも、あきらめたくない。ではどうする。

教えてもらうのも方法。
最近は手軽に計算機が使えるようになってきたので、
プログラムを書いて計算機に答えを教えてもらう。
プログラムを書くのもめんどうだけど、その先に楽が待っている。

実は、みんな考えることは同じ。
「テンパズル プログラム」で検索をすると、
たくさんの人がプログラムを作って公開しているようだ。

プログラムは、計算機に
 どの順番でどのように調べるか
を伝える手紙。

よんすうパズルを解く方法として、
最後の計算から考える方法をすでに知っているので、
それを計算機がわかる言葉にすればよいのだが。

小学校でもプログラミングの勉強が始まったそうな。
スクラッチでプログラムを書いたことはあるかな。

最初から難しいことはできないので、
まずは、簡単だけどめんどうなことを計算機にしてもらおう。

前に、
「4桁の数は全部で1万個ありますね。
 でも、その中の数字を小さい順に並べてできる数は、
 なんと 715 個しかありません。」
と書いた。

プログラミングの手始めとして、
715個であることを計算機に調べてもらおう。

準備は大人に手伝ってもらうとよい。
0. まず、計算機のブラウザで「スクラッチ」を検索するか
 https://scratch.mit.edu にアクセスする。
1. 画面の左上に「作る」があるのでクリックする。
2. 画面の左上に🌐ボタンがあるのでクリックし、
 「日本語」か「にほんご」を選ぶ。
 「にほんご」を選ぶと、説明がひらがなやカタカナで表示される。
3. チュートリアルの画面が出ているときは「とじる」をクリック。
4. 左中頃の「へんすう」をクリック。
5. 「へんすうをつくる」をクリックし、
 あたらしいへんすうのせつめい:の下の枠内に、
 数をどこまで数えたか覚えておく場所の名前を書く。
 自分で好きな名前をつけることができる。
 たとえば、「n」 とか、「i」 とか、「カウンター」とかを書く。
 長い名前だと打ち込むのが大変、
 「n」 みたいに短いと後で見たときに、
 何を覚えている場所かわからなくなるけど、打ち込むのは楽。
 名前を打ち込んだら「すべてのスプライトよう」を選び、OKをクリック。
6. 「へんすうをつくる」をクリックし、
 一の位の数の数をしまう場所のための へんすう をつくる。
 「一位」でも、「n1」、「a」でも名前は自由。
 十の位の数、百の位の数、千の位の数の変数も作ろう。
 次の図は 
  千の位の数用の変数を「a」、百の位の数用の変数を「b」、
  十の位の数用の変数を「c」、一の位の数用の変数を「d」
 としたときの画面。


7. 画面、右上の変数をマウスでドラッグして、
 千の位の a が左端に、その横にb, c, d が並ぶように、
 カウンターがこれらの下にくるように移動しよう。


8. 準備ができたので、まず 0000、0001、・・・ 、 0009 を数えてみよう。
9. 出来上がったプログラムを動かすときは、緑の旗をクリックする。
 このためには、左側のイベントをクリックし、「旗が押されたとき」を
 真ん中の場所にドラッグし、プログラムの先頭にする。
10. 数を数えるので、カウンターの値を 0 にしておく。
 このために、左側のへんすうをクリックし、「□を○にする」をドラッグし、
 「旗が押されたとき」の下につける。
 そして、□を「カウンター」に、○を「0」に。


11. 一の位は d に覚えさせていた。
 そこで、d を 0 から 一つずつ増やしながら 9 まで、カウントしながら繰り返す。
 つまり
  i. まずは d を 0 とし、
  ii. d が 9 より大きくなるまで以下 iii-vi を繰り返す。
  iii. カウンターを一つ増やす。
  iv. 動作の確認をするために、猫が鳴く。
  v. 1秒待つ。
  vi. d を一つ増やす。
 これをスクラッチ語に翻訳すると、以下のようになる。

 i. 左側の へんすう をクリックし、「□を○にする」をドラッグし、
  「カウンターを 0 にする」の下につける。
  そして、□を d に、○を 0 に。
 ii. 左側の せいぎょ をクリックし、「<六角形> までくりかえす 」をドラッグし、
  「d を 0 にする」の下につける。
  そして、左側の えんざん をクリックし、緑色の六角形「○ > ○」 をドラッグし、
  「<六角形> までくりかえす 」の <六角形> の位置にはめる。
  この中の 黄土色の d は へんすう からドラッグ、9 は打ち込み。
 iii. 左側の へんすう をクリックし、「□を○ずつかえる」をドラッグし、
  「d > 9 までくりかえす」の下につける。
  そして、□を カウンター に、○を 1 に。
 iv. 左側の おと をクリックし、「○ のおとをならす」を
  「カウンターを 1 ずつかえる」の下につける。
  ○には ニャー が選択されているのでそのまま。
 v. 左側の せいぎょ をクリックし、「○ びょうまつ」を
  「ニャー のおとをならす」の下につける。
  ○には 1 が入っているのでそのまま。
 vi. 左側の へんすう をクリックし、「□を○ずつかえる」をドラッグし、
  「1 びょうまつ」の下につける。そして、□を d に、○を 1 に。
12. 緑の旗をクリックするとプログラムが動作する。
 d が 0 のとき、カウンターが 1 となり、猫が鳴き、1秒おやすみ、
 d が 1 となり、カウンターが 2、猫が鳴き、1秒おやすみ
 これを繰り返して
 d が 9 となり、カウンターが 10、猫が鳴き、1秒おやすみ
 d が 10 となったので繰り返しは終了。
 カウンターに d が 0 から 9 までの個数 10 が蓄えられている。
13. つぎは、0000 から 0099 まで数えてみよう。
 c を 0 から 9 まで変えて繰り返すが、
 c のそれぞれの値に対して、d を 0 から 9 まで変えて繰り返す。

 まず、d についての繰り返しの部分を以下のように外し、
 c についての繰り返しを作る。


 ここでは猫の鳴き声をやめ、休みを 0.2 秒にした。
 d の繰り返しの部分を「c を 1 ずつ変える」の上に入れる。


14. では、0000 から 9999 まで数えてみよう。これは宿題。
15. 0000 から 9999 までの数で、
 右となりの数字が同じか大きくなっている数を数えるのは
 どのようにしたらよいだろうか。これも宿題。
 (ヒント:2桁で紙に書いてやってみる。
   00, 01, ..., 09, 10, 11, 12, ..., 19, 20, 21, 22, ..., 98, 99)

よんすうパズル 今週の問題

a. 1446
b. 1578
c. 2577
d. 3789
e. 3344

f. 1356
g. 1479
h. 2344
i. 4689
j. 4478




2021/02/07

3. 最後の計算から考えるのは後回し

自分が車のナンバーの 4 つの数字を見て考える始めるときを思い起こすと、
どうも当てずっぽうで計算してみているようだ。あれこれ試して上手くいけばオッケー。

たとえば、1123 をみると、2+3=5 が目につく。
「とすると 1+1=2 から (2+3)x(1+1)=10 だ」とひらめく。

1123 の 1+2=3 から (1+2)x3+1=10 がひらめくときもある。

あるいは、最後の計算から考えていることになるが、
2 をみると、5 ができないかなとひらめく 2x(1+1+3)=10。

慣れてくると、どこから手をつけるのかが見えて来て、ひらめきが早くなる。

難しい問題は、当てずっぽうで色々な組み合わせで計算しても、上手くいかない。
そのような場合に、先週の「最後の計算から逆に考える方法」が役に立つ。

今週は、当てずっぽうでも解が得られやすい簡単な問題をたくさん解いてみよう。
もちろん、ひらめかなければ最後の計算から逆に考えるという
先週の方法を使ってもよい。

次の問題は足し算、引き算で 10 にできる問題。
a. 1333
b. 2345
c. 3456
d. 3689
e. 1249

以下も同じようなやさしい問題。
f. 2233
g. 2246
h. 1344
i. 2677
j. 1799

次の問題は簡単な掛け算(例えば1の段の掛け算)や
簡単な割り算(例えば同じ数の割り算)も使う問題。
k. 1136
l. 1459
m. 2458
n. 2999

以下も同じような問題。
o. 1239
p. 1578
q. 4456
r. 2222

量が多いのでゆっくり楽しんでください。

以下は、前回の 2377 の解説の補足です。
 7を最後に使うとすると 2, 3, 7 を使って 3 か 17 を作れるか調べます。
 3を最後に使うとすると 2, 7, 7 を使って 7 は作れるかしらべます。
 などなどシッポから考えていくと答えが顔を出します。
はやってみましたか?

最後の計算から逆に考えるのは結構 めんどうくさい のです。
頭の中だけだと、どこまで調べたか忘れてしまい、
同じことをなんども考えたりしてしまいます。
頭の中だけで頑張るのも脳トレになりますが、
書いてみると少し楽になります。

7を最後に使う。
 3+7=10 なので 2, 3, 7 から 3 を作れるか?
  7 を使う。
   7-4=3 なので 2, 3 から 4 は作れるか? ダメそう。
   10-7=3 なので 2, 3 から 10 は作れるか? ダメそう。
   21/7=3 なので 2, 3 から 21 は作れるか? ダメそう。
  3 を使う。
   0+3=3-0=3 なので 2, 7 から 0 は作れるか? ダメそう。
   6-3=3 なので 2, 7 から 6 は作れるか? ダメそう。
   1x3=3/1=3 なので 2, 7 から 1 は作れるか? ダメそう。
   9/3=3 なので 2, 7 から 9 は作れるか? できた!
    (2+7)/3+7=10 だ!
  2 を使う。
   1+2=3 なので 3, 7 から 1 は作れるか? ダメそう。
   5-2=3 なので 3, 7 から 5 は作れるか? ダメそう。
   6/2=3 なので 3, 7 から 6 は作れるか? ダメそう。

 17-7=10 なので 2, 3, 7 から 17 を作れるか?
  7 を使う。
   10+7=17 なので 2, 3 から 10 は作れるか? ダメそう。
   24-7=17 なので 2, 3 から 24 は作れるか? ダメそう。
   119/7=17 なので 2, 3 から 119 は作れるか? ダメそう。
  3 を使う。
   14+3=17 なので 2, 7 から 14 は作れるか? できた!
    ((2x7)+3)-7=10 だ!
   20-3=17 なので 2, 7 から 20 は作れるか? ダメそう。
   51/3=17 なので 2, 7 から 51 は作れるか? ダメそう。
  2 を使う。
   15+2=17 なので 3, 7 から 15 は作れるか? ダメそう。
   19-2=17 なので 3, 7 から 19 は作れるか? ダメそう。
   34/2=17 なので 3, 7 から 17 は作れるか? ダメそう。

 70/7=10 なので 2, 3, 7 から 70 を作れるか?ダメそう。
 
3を最後に使う。
 7+3=10 なので 2, 7, 7 から 7 を作れるか?
  7 を使う。
   7+0=7-0=7 なので 2, 7 から 0 は作れるか? ダメそう。
   14-7=7 なので 2, 7 から 14 は作れるか? できた!
    ((2x7)-7)+3=10
   21/3=7 なので 2, 7 から 21 は作れるか? ダメそう。
  2 を使う。
   5+2=7 なので 7, 7 から 5 は作れるか? ダメそう。
   9-2=7 なので 7, 7 から 9 は作れるか? ダメそう。
   14/2=7 なので 7, 7 から 14 は作れるか? できた!
    (7+7)/2+3=10

 13-3=10 なので 2, 7, 7 から 13 を作れるか?
  7 を使う。
   6+7=13 なので 2, 7 から 6 は作れるか? ダメそう。
   20-7=13 なので 2, 7 から 20 は作れるか? ダメそう。
   91/7=13 なので 2, 7 から 91 は作れるか? ダメそう。
  2 を使う。
   11+2=13 なので 7, 7 から 11 は作れるか? ダメそう。
   15-2=13 なので 7, 7 から 15 は作れるか? ダメそう。
   26/2=13 なので 7, 7 から 26 は作れるか? ダメそう。

 30/3=10 なので 2, 7, 7 から 30 を作れるか?ダメそう。

2を最後に使う場合には上記のように調べると解がないことがわかります。

また、(2x7)-(7-3) =10 も解です。
これは 2つの数字の計算と残りの2つの数字の計算を組み合わせて調べます。
2x7=14 なので残りの 3 と 7 を使って 4 ができるかを調べた結果です。

最後の計算から考える方法は面倒ですね。
なので、まずは、ひらめきを鍛え、
最後からの計算方法もときどき使いながらがよさそうです。
 

20. 円錐の半分?

17-19 で三角形、四角形の面積を半分にする問題を解いた。 今回は円錐を半分にする実験をしてみよう。 まず、円錐を作るための図形をスクラッチで描いてみた。 プログラムはここ。 https://scratch.mit.edu/projects/561804896 これを実行すると...