<問題1>盗人算(ぬすびとざん):江戸時代の書物「塵劫記(じんこうき、じんごうき)」にある問題です。※参考文献:塵劫記、吉田光由著、大矢真一校注、岩波書店、1977。
原本の例は、ここをクリックすると見ることができます。
この左側のページに「十 きぬ盗人を知る事」というタイトルがつけられた問題があります。
図にもあるように、あらましは次のようなものです。

橋の下で盗人(ぬすびと)たちが何やら話しているのが聞こえます。どうやら、盗(ぬす)んだ「きぬ」(絹)(反物(たんもの)のこと)を分けようとしているようです。ところが、8反(たん)ずつ分けると7反たらず、7反ずつ分けると8反あまってしまい、困(こま)っているようです。

さて、盗人と反物(たんもの)の数はいくらか?

という問題で、解(と)き方は、つぎのような方法です。
8反と7反を加えると15になる、これが盗人の人数であるとしています。

※解き方は、小学生ではやや難(むずか)しいのですが、中学生以上であれば方程式を使うと簡単です。

<プログラミングによる解き方>
このような問題は、計算式を作ることができれば、すぐに答えを求めることができます。ところが、今(いま)話題(わだい)のビッグデータやAI(えーあい)の処理(しょり)は、計算式で簡単(かんたん)に求(もと)めることができない性質(せいしつ)のものです。
どうするかというと、処理のとちゅうで計算式を使うことはありますが、すべての場合を調(しら)べていきます。このように、すべての場合を一つひとつおこなう方法のことを「しらみつぶし」の方法といいます。
ですので、どちらかというと数学よりも人間の作業に近い方法により、コンピュータの高速計算能力(こうそくけいさんのうりょく)で問題を力づくで処理していきます。ただし、プログラミング独特(どくとく)の仕組みがあるので、それは学習していく必要があります。

この例(れい)の場合(ばあい)は、次のように調べていきます。

まず、最初(さいしょ)に盗人の数を0人と考えます。ふつうは0人ということはあり得(え)ませんが、コンピュータの世界では1からではなく0から始まることが多いので0としました。なお、この例では1から始めてもかまいません。
8反(たん)ずつ分けると7反たりないので、反数(たんすう)をもとめるには
 0人×8反-7反=-7反
となります。
同時に、7反ずつ分けると8反あまってしまうので、 反数をもとめるには
 0人×7反+8反=+8反
となり、2つの条件で反数が同じではないので、0人は正しくないことになります。
次に1人増(ふ)やして、計算すると
 1人×8反-7反=1反
 1人×7反+8反=15反
と同じではなく、問題の条件(じょうけん)が成り立っていません。
そこで、同じように順番(じゅんばん)に盗人の数を15人まで増やしたとすると、
 15人×8反-7反=113反
 15人×7反+8反=113反
となり、同時に条件を満足(まんぞく)します。
したがって、盗人の人数は15人、きぬの数は113反ということになります。
答えがもとまったので、これ以上(いじょう)人数を増やして処理を続ける必要がないのでプログラムは終わりです。

以上の処理の流れをまとめると、次のようになります。

1. 盗人の数を0と考える。
2. 「盗人の数×8-7=盗人の数×7+8」という式が成り立つまで次の処理を繰(く)り返(かえ)します。
3. 盗人の数を1人増やす。
4. 2の式が成り立ったら繰り返しを終わります。
5. 答えを表示して、プログラムを終了します。

<Scratchでプログラミング>
それでは、上でまとめた処理の流れをもとにして、Scratchでプログラムを作ってみましょう。

はじめに、[旗(はた)が押されたとき]ブロックを配置(はいち)します。

つぎに、上の処理では、盗人の数を、0、1、2、3、…、15というように、1ずつ変化(へんか)させています。このような処理をさせるために、プログラムでは変数(へんすう)というものを使います。変数は、しばしば値(あたい)を入れて変化させるための箱(はこ)のようなものだとたとえられます。変数(箱)には、名前をつけることになっています。Scratchでは変数名に日本語を使うこともできますが、グローバル(世界的)な観点(かんてん)から英字(できれば英語)のほうがよいでしょう。たとえば、あなたが作った作品をもとにして外国の友だちがリミックスする状況(じょうきょう)を考えてください。※リミックス:Scratchの用語(ようご)で、ある作品を変更(へんこう)して新たな作品を作ることです。

たとえば、つぎのように変数の名前として「data」とつけて、その中に値「3」を入れることができます。 箱の内容は、プログラムにより変更(へんこう)することができます。

今回は、「nusubito」という名前の変数を作るので、変数のコードにおいて[変数を作る]のボタンを押(お)して、次のように新しい変数を作ります。

こうして作った変数に値を入れるには、つぎのブロックを配置します。

続いて、繰返し処理のブロックを配置します。

盗人の数を1人増やすために、次のブロックを上の繰り返し処理のブロックの中に埋(う)め込(こ)みます。

そうすると、つぎのようになります。

最後(さいご)に、 答えを表示 するブロックを追加(ついか)します。

完成(かんせい)した形(かたち)は次のようになります。

このプログラムを実行すると、キャットが次のように答えてくれます。


<練習問題1>ラクダの分配:オリジナル作問(さくもん)
【元の話】昔(むかし)アラブ人が17頭のラクダを持っていて、遺産(いさん)として長男へ1/2、次男へ1/3、三男へ1/9を分配(ぶんぱい)することにした。しかし、割(わり)り切れず(分配が整数(せいすう)にならず)、うまく分けられないためにもめていた。そこに旅人がやってきて1頭を差し出してくれたため、めでたく解決(かいけつ)したというお話です。
※参考文献(さんこうぶんけん):科学・千夜一夜: 始祖鳥からフラクタルまで

【変形(へんけい)オリジナル問題】
長男は1/2、次男は1/3、三男は1/9 にうまく分配できるときに1頭あまる、ラクダの最小の数を求めるプログラムをScratchで作成してください。
【ヒント】
・ラクダの数を1から始めて1頭ずつ増やして確認(かくにん)する、しらみつぶしの方法を使います。
・割り切れてうまく分配できたときには、1頭余ることに注意(ちゅうい)してください。
・割り切れる(整数かどう)かを調べるには、次の方法が利用(りよう)できます。
 整数チェック
・この問題の例は、最小公倍数(小学5年生で学ぶ)を求める内容と同等(どうとう)です。
・プログラムは色々(いろいろ)な作り方ができるので、答えは必ずしも一通(ひととお)りではありません。

実行結果は次のように表示するものとします。


Copyright (C) 2022 Easy Programming