search
LoginSignup
0

posted at

updated at

なでしこさんのタートルグラフィックスで旅人算を可視化するよ!

なでしことは

 日本語プログラミング言語「なでしこ」は、その名の通り日本語でプログラムが出来る言語です!

 日本語プログラミング言語としては、なでしこの前身言語に「ひまわり」があり、そこから数えて今年はなんと20周年だそうですよ。しゅごい!!

 なでしこは、もともと事務処理の自動化を目的として作られたということで、特にv1は、それはそれはもういろんなコトの出来そうな気がする様々な命令が取りそろっていて20年の重みを感じさせられますね☆
 ひまわり時代からのファンだという方もたくさんいらっしゃるそうです。

 さらに近年では中学校の教科書にも採用(v1)されているほか、今年は、センター試験用手順記述標準言語(DNCL、DNCL2)互換モードが実装される(v3)など、教育分野が盛り上がってますね。
 フレッシュなユーザーさんがいっぱい増えるといいですね♪

 なでしこは日本語なので、子どもからお年寄りまで誰でもプログラムができますよ。
 三世代でプログラミングが楽しめそうですよね~☆

旅人算の問題

 さて、アドベントカレンダーの1日目は今年も和算をなでしこさんで解いてみます。
 一昨年に鶴亀算、去年にねずみ算をやったので、なんかついそうでなければならないような気になってしまっているるるる💧
 ちなみに、数学的に解き方を教える記事ではありません。
 壊滅的に算数の出来ないワタクシが、古典を読んでその通りになでしこさんのプログラムにしてみるという記事です。

 さてさて、旅に話を持ってく流れがマッタク思いつかなかったけど、旅人算とは、こんな問題です。

たとえば牛と馬がいて、毎日牛は10里、馬は15里歩きます。
牛は三日先に行きました。
馬が今日出発して、何日後に牛に追いつくでしょうか?

『勘者御伽双紙 下』 中根法舳 寛保3 (二)

 和算ていうか・・・あるよねー、こんな問題・・・:persevere:
 江戸時代からあったんだねー。

 でもま、これはテストじゃないので、ちゃんと解き方書いてあります。

牛の10里に3を掛ければ30里になります。これを実とします。
馬の15里から牛の10里を引いて残り5里です。
これを法として実を割れば、6日となります。

 実とか法とかいうのは和算の用語です。ワタシも書いてあるとうり読んでるだけで説明できるほど詳しくないので、気になる人はググりましょう:sweat_smile:
 ともかく、このとうりになでしこのプログラムにすると、こんな感じ?

10に3を掛けて実に代入。実を表示。# 30
15から10を引いて法に代入。法を表示。# 5
法で実を割って表示。# 6

 できました。
 馬が歩いてる間牛も歩き続けてるわけだけど、結局は、牛が先行した分の距離を、牛より馬の足が速い分で割るだけ! ってことですね。
 こうゆうことかな?

馬歩く速さは15#里
牛歩く速さは10#里
牛先行日数は3#日
牛歩く速さに牛先行日数を掛けて、牛先行距離に代入。
馬歩く速さから牛歩く速さを引いて、歩く速度差に代入。
答えは、歩く速度差で牛先行距離を割ります。
答え&「日」と表示。# 6日

 ふーん。でも、実際見てみないと信用できないよね~(ナゼ💧)
 ムカシは、1cmを1里とゆうことにして・・・と、定規で測って豆とか小石とか進ませてみたりしてたわけですが(爆)今のワタシには、なでしこさんがある!
 タートルグラフィックスの機能を使って、実際に牛さんと馬さんを動かしてみることにします。
 ・・・と思って、まずはたいしたことない牛と馬の画像作るのに、まるまる一日かけましたとさ:sweat:

2022-11-10.png

# 牛と馬を作成
描画中キャンバスの「幅」に400をDOM属性設定。
カメ画像URLは、「https://n3s.nadesi.com/image.php?f=208.png」# べこ
カメ作成して牛に代入。
カメ画像URLは、「https://n3s.nadesi.com/image.php?f=209.png」# 馬コ
カメ作成して馬に代入。

# 条件
牛歩く速さは10#里(毎日)
馬歩く速さは15#里(毎日)
倍率は3。# 描画用の倍率
「牛は一日に{牛歩く速さ}里、馬は一日に{馬歩く速さ}里歩きます」と言う。

# 位置に付かせる
牛と馬を並べる。
牛歩いた距離は0#里
馬歩いた距離は0#里
先行日数は3#日
「牛が{先行日数}日先に行きます」と言う。
牛を先行日数だけ先行させる。

# スタート!
「馬が歩き始めます{改行}何日で追いつくかな?」と言う。
日数は0#日目
馬歩いた距離が牛歩いた距離未満の間:
    牛歩く。
    馬歩く。
    日数=日数+1。
    0.5秒待つ。

「答え:{日数}日でした☆」と言う。
検算します。

# 関数
●検算:
    牛歩く速さに先行日数を掛けて実に代入。
    馬歩く速さから牛歩く速さを引いて法に代入。
    答えは法で実を割ります。
    「牛の{牛歩く速さ}里に{先行日数}日を掛けると{実}里となります。
馬の{馬歩く速さ}里から牛の{牛歩く速さ}里を引くと{法}里となります。
{法}里で{実}里を割れば{答え}です。
{答えを切り上げ}日目で追いつくことになります。」と言う。

●(牛と馬を)並べる:
    2回:
        牛か馬は回数-1。# カメは作られた順に0スタートで連番になっています
        牛か馬にカメ操作対象設定。
        [50,50+牛馬*80]へカメ起点移動。
        90だけカメ右回転。
    1秒待つ。

●牛歩く:
    牛にカメ操作対象設定。
    牛歩く速さ*倍率だけカメ進む。
    牛歩いた距離=牛歩いた距離+牛歩く速さ。

●馬歩く:
    馬にカメ操作対象設定。
    馬歩く速さ*倍率だけカメ進む。
    馬歩いた距離=馬歩いた距離+馬歩く速さ。

●(牛を先行日数だけ)先行させる:
    先行日数回:
        牛歩く。
        0.5秒待つ。

 できました!
 見事六日で二頭が並びました!

 リンク先では、条件を変えたりもできるようにしたので試してね☆

池を回る問題

 続きはこんな問題。

たとえば周囲100里の池があります。
これを牛と馬が同じ方向へ回ります。
毎日牛は5里、馬は30里歩きます。
今日一緒に出発して、何日後に再会できるでしょう。

 これも、あるよねー・・・:weary:
 なんでみんなそんな、やたらと池を回りたいんだよと思ってたけど、江戸時代からの伝統だったんだね。それじゃ、しょうがないね!(え)

 それにしてもまた、さっきより牛と馬の足の速さにえらく差が出ましたな。
 ってか周囲100里の池って・・・絶対池のサイズじゃないよね?!
 調べたら琵琶湖の外周が約200キロってことでした。1里はおおよそ4キロなんですから・・・!!!
 そして、一緒に出発して再び会うということは、牛が周回遅れになるって事なんだから、お馬さんが大変すぎる~(いらん妄想に時間を費やして、テストの時間を浪費する人でした💧)

 解き方はこうなっています。

馬の30里から牛の5里を引いて、残り25里。
これを法として、池の外周100里を割れば4日となります。

牛歩く速さは5#里
馬歩く速さは30#里
池外周は100#里
馬歩く速さから牛歩く速さを引いて、歩く速度差に代入。歩く速度差を表示。# 25
池外周を歩く速度差で割って表示。# 4

 こんなかんじ?

 これも、タートルグラフィックスで描いてみます。
 知らないうちに、カメパスなる命令が追加されていたので使ってみる!

# 牛と馬を作成
描画中キャンバスの「幅」に400をDOM属性設定。
描画中キャンバスの「高さ」に400をDOM属性設定。
カメ画像URLは、「https://n3s.nadesi.com/image.php?f=208.png」# べこ
カメ作成して牛に代入。
カメ画像URLは、「https://n3s.nadesi.com/image.php?f=209.png」# 馬コ
カメ作成して馬に代入。

# 条件
牛歩く速さは5#里(毎日)
馬歩く速さは30#里(毎日)
一里は10#px
「牛は一日に{牛歩く速さ}里、馬は一日に{馬歩く速さ}里歩きます」と言う。

# 池を描く
周は100#里
角度は360を周で割る。
出発地点は[205,40]。
池作成。
「外周{周}里の池を、牛と馬が同じ方向へ回ります」と言う。

# 位置に付かせる
牛歩いた距離は0#里
牛現在地は0#里
牛周回数は0#回
馬歩いた距離は0#里
馬現在地は0#里
馬周回数は0#回
牛と馬を並べる。

# スタート!
「牛と馬が一緒に出発します{改行}何日後に再会できるかな?」と言う。
日数は0#日目
馬追い掛け中は、はい。
馬追い掛け中の間:
    日数=日数+1。
    馬歩く速さ回:
        馬歩く。
        もし、(回数-1)%(馬歩く速さ/牛歩く速さ)<1ならば、牛歩く。
        もし、(馬周回数>牛周回数)かつ(馬現在地≧牛現在地)ならば、:
            馬追い掛け中はいいえ。「追いついた!」と言う。抜ける。
    「{日数}日目:馬は{馬周回数}周と{馬現在地}里 牛は{牛周回数}周と{牛現在地}里」を言う。

「答え:{日数}日でした☆」と言う。
検算します。

# 関数
●検算
    馬歩く速さから牛歩く速さを引いて法に代入。
    答えは周を法で割ります。
    「馬の{馬歩く速さ}里から牛の{牛歩く速さ}里を引くと{法}里になります。
池の周囲{周}里を{法}里でを割れば{答え}です。
{答えを切り上げ}日目で追いつくことになります。」と言う。
ここまで。

# カメパスで池を描く
●池作成:
    # 設定
    2回:
        カメ非表示。
        牛か馬は回数-1。# カメは作成した順に0スタートで連番が付与されています。
        牛か馬にカメ操作対象設定。
        90だけカメ右回転。# 右を向かせる
        10にカメペンサイズ設定。# 軌跡の太さ
        赤色にカメペン色設定。# 牛の軌跡色
        出発地点へカメ起点移動。
    # 池を描画
    0にカメ速度設定。
    茶色にカメペン色設定。# 池線色
    水色にカメ塗り色設定。# 池塗り色
    カメパス開始。
    周回:
        角度だけカメ右回転。
        一里だけカメ進む。
    カメパス塗る。
    カメパス線引く。

    青色にカメペン色設定。# 馬の軌跡色
    1秒待つ。

●(牛と馬を)並べる:
    2回:
        牛か馬は回数-1。
        牛か馬にカメ操作対象設定。
        カメ表示。
        1秒待つ。

●牛歩く:
    牛にカメ操作対象設定。
    角度だけカメ右回転。
    一里だけカメ進む。
    牛歩いた距離=牛歩いた距離+1。
    牛現在地=牛歩いた距離%周。
    牛周回数=牛歩いた距離/周を整数変換。
    0.02秒待つ

●馬歩く:
    馬にカメ操作対象設定。
    角度だけカメ右回転。
    一里だけカメ進む。
    馬歩いた距離=馬歩いた距離+1。
    馬現在地=馬歩いた距離%周。
    馬周回数=馬歩いた距離/周を整数変換。
    0.02秒待つ

 できました!
 ぐるっと回って、4日で馬が牛に追いつきます。
 前と違って一緒に出発するので、馬は最初から牛の前におりますが、歩いた距離を池一周分の100で割り、池を何周したかと、割った余りで、出発地点を0としての現在地とに分け、両方を馬が牛を上回った時で判定しています。

 こちらも、条件を変えてできるようにしたので試してね☆

遺題

 問題にはもう一つ続きがあったんだけど、新たに羊と鹿が登場するんだよね~。
 同じ池を回る問題だし、タートルグラフィックスの画像を作るの面倒だからやめました~w
 ちなみにこんな問題です。

たとえば周囲96里の池があります。
これを、羊、鹿、牛が同じ方向へ回ります。
一日に羊は26里、鹿は35里、牛は11里歩きます。
今日一緒に出発し、何日後に全員が再び会えるでしょう?

 答えと解き方は訳しません。
 こうして、最後に答えを書かずに置いておく問題を、遺題と言いますよ。
 ま、ワタシの問題じゃないから正確には違いますけど💧
 算数の問題として普通に解くというよりかは、いい感じになでしこで解いてみたり、タートルグラフィックスで動かしてみたりして遊んでくれたらうれしいです。
 わざわざ画像作らんでも、なでしこには標準でカメの他にゾウとパンダと、ちょうど三匹いますw
 こちらで遊んだり、投稿したりもできますよ☆

おわります

 今回も去年、一昨年に引き続き、アドベントカレンダーの最初の記事は、なでしこの紹介とカンタンな和算を解いてみる記事でした。
 さすがに日本語でなでしこらしく四則演算するだけだと芸が無いので、今年はタートルグラフィックスにしてみましたが、タートルグラフィックスの使い方の説明には全くなっておらずスミマセン。
 マイナビの連載に記事がありましたので、そちらを参考に是非遊んでみてください☆

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0