Python(パイソン)入門3~乱数を利用した、じゃんけんゲーム作成など(生成AI・ChatGPT4も使用)

前回の2本目の記事から1ヶ月も経ってしまったが、人気のプログラミング言語「Python」(パイソン)の3本目の記事を書くことにしよう。 1本目の記事2本目の記事は、次の通り。

  

 Python入門1~人気プログラミング言語を高校教科書副教材とオンライン環境Bit Arrowで簡単に

  

 Python入門2~高校副教材とオンライン環境Bit Arrow、さらにAI(ChatGPT4)も使用

   

最初から、高校の副教材『Python入門』(東京書籍,2022年)と、オンライン環境「ビットアロー」を使用。前回からは、対話型の生成AI、ChatGPT(model4)も参照。今回も、ChatGPT4を参照した。

   

これまでの感触だと、ネット情報の通り、GPT4のプログラミング能力は高い。というより、数ある能力の中で、プログラミングの能力が一番高いような気もする。全く間違えてないし、余裕を感じるのだ。

  

つい最近、GPT4は画像も扱えるようになった。試しに、Pythonの簡単なプログラムのJPEG画像を2枚見せたら、どちらも正確に説明。完全に読み取ってる。ただ、ちょっと回答のスピードが遅くなったから、まだ画像の読取は負荷が高いらしい。

  

    

      ☆     ☆     ☆

では、プログラミングの話に入ろう。数を1つ与えて、それが3か2の倍数なら、「3か2の倍数」と表示するプログラム。if文の条件に、論理演算子(=結合子)orを使う練習。

     

231006a

   

テキストでは、もっと半角スペースを多用してるが、面倒なので、上では少し省略。3の倍数という条件は、3で割った余りが0(x%3=0)と考えてる。x=9で実行した結果は、下の通り。

    

231006b

   

   

      ☆     ☆     ☆

次に、aとbの値をキーボードで入力して、a+bの計算結果を表示するプログラム。

   

普通に4とかインプットするだけだと、数ではなく文字として扱ってしまうので、足し算ができない。input関数で数字入力した後、int関数を使って、数へと変換する必要がある。入力の箇所の書き方(a->)は、おそらく色々あると思う。ここではテキストに従った。

      

231006c

    

実行して、aに5、bに8を入力すると、13という正答を表示した。

  

231006p

   

231006d

  

上のプログラムの画像を、ChatGPT4に入力すると、正しく説明して来た。画像の処理については、プログラミング以外も含めて、わりと近いうちに別記事を書く予定。ここでは簡単な報告に留める。

    

    

      ☆     ☆     ☆

続いて、1以上8未満の整数のうち、奇数をすべて表示させるプログラム。変数の範囲を示すfor文と、条件を示すif文を組み合わせる。「未満」というのがちょっと分かりにくい。この後の別のプログラムだと、「以下」になるので、余計に混乱する。

     

奇数は、2で割った余りが0でない(!=0)と考えた。「でない」という否定表現を使いたかっただけで、余りが1である(==1)と考えてもいいはず。1以上8未満の整数で実行すると、1、3、5、7と縦に並んだ。間を空けて横に並べる方法はまだ知らないが、GPT4に聞けばすぐ答えると思う。

          

231006e

   

231006f

   

上のプログラムの画像も、GPT4は正しく説明できた。

    

    

      ☆     ☆     ☆

そして、今回のメインである、じゃんけんゲーム。グーを0、チョキを1、パーを2で表現。相手(コンピューター)には、乱数を発生させるrandom.randint関数を使って、0以上2以下の整数のどれか1つを選ばせる(未満ではないので要注意)。自分は、どれか1つの数を入力。

        

まず、aite(相手)とjibun(自分)の手を示すだけのプログラムを実行して、1(チョキ)を入力。一番最初に、乱数を使うための準備として、randomモジュールという仕組みをインポートする。

     

231006g

    

231006h

  

上の場合、相手は2(パー)で、自分は1(チョキ)だから、勝敗は自分の勝ちとなる。この、じゃんけんの勝敗まで表示するプログラムは、例えば、次の通り。勝敗の決定には、if文を三重に使用。

     

231006i

     

勝ち負けの結果(result)は、(3+jibun-aite)%3の値で決めることが可能。最初に3をプラスするのは、マイナスを避けるため。

  

例えば、相手が1(チョキ)、自分が0(グー)なら、(3+0-1)%3=2%3=2で、自分の「勝ち」となる。テキストでは、結果を数で表すだけになってたので、勝敗は日本語で表示するように改良した。

    

3回やって、引き分けが2回続いた後、負けで終了。私は1(チョキ)、コンピューターは0(グー)だった。

  

231006j

   

   

      ☆     ☆     ☆

最後に、ChatGPT4を使用。まず、下のように、じゃんけんゲームに関して長めの説明を入力。自由にプログラミングさせてみた。この日本語の説明を素早く読み取って対応できるのは、素晴らしい能力だと感心。青・緑・赤・黄色・白・グレーの色分けも分かりやすい。「コンピューター」と「あなた」のじゃんけん。

      

231006k

     

231006l

    

231006m

  

プログラムの中に日本語の説明を加えて、グー、チョキ、パーという言葉も入れて、自分の入力が0、1、2のどれでも無い時にはエラー警告を出せる仕組みになってる。右に長く伸びてる部分はカット(省略)した。

     

勝ち負けの判定には、普通の場合分けを利用。勝ちは、自分が0(グー)で相手が1(チョキ)か、自分が1で相手が2(パー)か、自分が2で相手が0グーの時。・・・or・・・or・・・の形。丁寧なプログラムだが、人間にとってはやや長過ぎる気もする。

     

    

      ☆     ☆     ☆

上のプログラムを書かせた直後、私が書いたプログラムを入力してみた。画像ではなく、文字入力。すると、(3+jibun-aite)%3という処理まで正確に理解して、私の細かい入力ミスまで指摘して来た。やさしく、気を使いながら♪

      

231006n

     

    

231006o

   

私はうっかり、全角でプラスを入力してしまったのだ。普通のプログラミングのシステムなら、エラーとしてチェックして来る所を、優しくアドバイス。人間の先生でも、ここまでの配慮は難しい。

   

「注意していただきたいことがあります: 一部の環境では・・・正しく認識されないかもしれません。通常の半角の’+'を使用することをおすすめします」

  

  

      ☆     ☆     ☆

プログラミングの家庭教師として考えても、安くて優秀。長時間労働でも追加料金なし。円安が痛いだけ♪ 1ヶ月20ドルが、今の為替レート(1ドル、約150円)で3000円になってしまった。

   

というわけで、プログラミングでも画像関連でも、もっとGPT4を使って行く予定。それでは今日はこの辺で。。☆彡

    

       (計 2636字)

| | | コメント (0)

Python(パイソン)入門2~高校副教材とオンライン環境Bit Arrow、さらにAI(ChatGPT4)も使用

(☆23年10月6日の追記: 関連する最新記事を別に新たにアップ。

Python入門3~乱数を利用した、じゃんけんゲーム作成など(ChatGPT4使用))

   

   

    ☆     ☆     ☆

前回の1本目の記事から、半年も経ってしまったが、人気のプログラミング言語「Python」(パイソン)の2本目の記事を書くことにしよう。

   

ちなみに、前回の記事はこちら。本当にほとんど何も知らない初心者向けの内容。

    

 Python入門1~人気プログラミング言語を高校教科書副教材とオンライン環境Bit Arrowで簡単に

  

当然、教科書の類と、プログラムを書いて実行する環境が最初のポイントになる。特に、安心して信頼できる環境が大切。

  

  

      ☆     ☆     ☆

私は、数学や論理は好きなのに、プログラミングとはどうも相性が悪いようで、昔から数ヶ月に1本くらいのブログ記事しか書いて来なかった。嫌いというわけではないけど、つい、自然に避けてしまう。

    

ただ、この半年間の空白は、個人的な相性とか感情、能力の問題だけではない。前回の記事の少し後、3月半ばに、対話型AI「ChatGPT」の新ヴァージョン・model4が登場。一気に性能が上がって、特にプログラミングは既にビジネスの実用レベルまで来てるというような話を聞いてた。

   

それが事実なら、素人がゼロからゆっくりプログラミングを学ぶ意味はあまり無い・・・とまで言うと言い過ぎかも知れないが、ますます意欲がそがれるのは確かだ。

  

とはいえ、実際にChatGPT4に数学や論理の問題を解かせてみると、まだまだ実力不足。たかが、普通の高校生~大学生レベルのように感じられる。別に難しい話でなくても、簡単な処理で凡ミスをしてることも少なくない。

   

では、プログラミングだと、どの程度の実力なのか? 苦手意識の強い素人の私が、簡単な問題で試してみることにした。しかし、その前に、私自身がほんの少しは分からなければいけないので、まずは復習で思い出す所からスタートした。

   

   

      ☆     ☆     ☆

前回と同じく、東京書籍の副教材『Python入門』が推奨してたオンライン環境、Bit Arrow(ビットアロー)にアクセス。半年経ってるから、サイトがダウンしてるかも・・と思ったが、普通に運営されてた。   

  

230906g

      

完全に忘れてたパスワードを探り当てた後、ログイン。新規プロジェクト「230905」を作成した後、新規ファイル「Py230905a」も作成。ファイル名は、単に「230905a」としたかったのに、なぜかその名前だと作れなかった。「Py」を先頭に付けると成功。注意書きは見当たらないが、そうゆう仕様なのか?

      

230906a

   

ウォーミングアップは毎度お馴染み、「Hello ・・・」。print関数で、シングル・クォーテーションに挟んで「Hello Python」と入力。実行タブから実行すると、実行画面ダイアログに「Hello Python」と表示された。

    

      

230906b

  

続いて、パスワード確認プログラムの復習。ただし、前回の記事とは少し設定を変更。変数 pw には、正しいパスワードとして、「1234」を代入。変数 ipt には、「password= 」とたずねるダイアログ・ボックスでの入力を代入。

  

そして、条件と反応を設定する if 文。pw が ipt と等しいなら、「login ok」と表示。そうでなければ〔等しくなければ〕、「wrong password」と表示。if の行と、else の行の最後には、コロンが必要だから、忘れずに。

     

230906c

  

実行すると、上図のようなダイアログが表示されて、正しいパスワード「1234」を入力すると、「password= login ok」と表示された。成功。

     

230906d

   

   

      ☆     ☆     ☆

ここからは、今回の新しい内容。同じ動作を繰り返し行う、for 文。といっても、似たような話は既に別のプログラミング言語で練習済み。

    

230906e

   

for の次の i が余計だと思うけど、テキスト(副教材)に従って、ほぼそのまま書く。range で反復の回数を定めて、またコロンが必要。

  

少しテキストとは変えて、ABC と DEF の表示を2回繰り返させた後、最後に繰返しなしで G を表示させる。繰返し〔ループ〕の範囲を定めるために、print の左側には同じ数のスペース〔空白〕を挿入。ここでは4コで、実は改行しただけで自動的に4つ空白ができた。この空白を入れる作業のことを、「インデント」と呼ぶ。

     

230906f

   

   

      ☆     ☆     ☆

さて、ここで人間の努力はひとまず休止。話題のAI、ChatGPT(有料サブスクのModel4)に色々な形でたずねてみた。

   

230906h

  

まず、上で書いた for 文のプログラムをコピペして、出力がどうなるかを質問。すると、一瞬で回答して来た。しかも、実行画面つきで。素晴らしい! 与えられたプログラムは解釈・実行できると。

      

230906i

   

では、与えられたプログラムを真似して、同種のプログラムをAIが作成できるかどうか、試してみると、これまた一瞬で正解だった。しかも、見やすいカラー表示で、実行結果つき。

      

   

      ☆     ☆     ☆

今度はサンプルとなるプログラムを与えずに、パスワード判定プログラムを作らせると、テキストよりも少し簡単なプログラムを表示して来た。ただ1つの長い名前の変数 password_input を使用してる。

     

230906j

   

この独自のプログラムを見て、テキストのプログラムとの比較をさせてみた。それぞれの長所と短所は何か?

   

230906k

     

すると、直ちに、やや長めの模範的な回答を示して来た。これだけ一瞬で答えるのは、プロの人間でも簡単ではないはず。

   

230906l

    

230906m

   

    

      ☆     ☆     ☆

私の言葉で説明し直すと、要するに、2つのプログラムは、変数の個数と名前が異なる。

  

テキストは、変数2コで、短い名前。特に、正しいパスワードも変数に入力してる所がポイントで、変更や、別の箇所への活用も容易だけど、面倒で、名前も分かりにくい

  

AIは、変数1コで、長い名前。応用する場面では多少、面倒になるけど、書くだけなら簡単だし、名前も分かりやすい。

    

多分、この私の説明をAIに示して、感想をたずねると、大げさに褒めてくれると思う♪ 基本的に非常にポジティブな反応を示して来る。

  

今まで唯一の例外は、株価の予想についてたずねた時。多額のお金がからむし、トラブルが起こりやすいし、最新の情報が必要で、正解のない話。この時だけは、素っ気ない消極的な回答ばかりになってた。

   

    

      ☆     ☆     ☆

プログラミングに関するAIの実力を少し確認した所で、最後に再び、人間の学習の続き。算数・数学的な、数の処理。

    

230906n

   

まず四則演算(+、-、×、÷)のうち、かけ算と引き算の組合せ。3つの変数x、y、zに、それぞれ2、3、5を代入した後、x×y-zを計算させると、2×3-5で、答の1が表示された。×の記号は、いつものように、アステリスク *。

   

230906o

   

最後は、if 文の条件を2つ、and(かつ)でつないで設定。and は、論理演算子と呼ばれるものの1つ。変数 a (ここでは5)が、5より大きくて、かつ、3で割った余りが0ならば、OK と表示。そうでなければ、NG と表示。整数の割り算の余りには、パーセントの記号 % を利用。

      

230906p

   

7は5より大きいけど、3では割り切れないから、条件を2つとも満たしてるとはいえない。よって、実行結果は、NG 。

   

230906q

    

  

ちなみに、上のプログラムで、and の代わりに or〔または〕という論理演算子を使うと、実行結果は OK になる。a>5またはa%3=0だから、a>5であればそれだけでよい。or なら、a=3でも、OK 。

     

かなり疲れた所で、今日はそろそろこの辺で。。☆彡

   

   

      (計 2973字)

   (追記78字 ; 合計3051)

| | | コメント (0)

Python(パイソン)入門1~人気プログラミング言語を高校教科書副教材(東京書籍)とオンライン環境Bit Arrowで簡単に

また3ヶ月も間が空いてしまったが、超初心者の立場でプログラミングの記事を書きながら勉強してみよう。前回まで書いてたC言語の続きでもよかったが、気分新たにPython(パイソン)。

   

開発者がテレビ番組のタイトルから付けた名前で、ニシキヘビという不気味な意味よりも、短くてユニークで神秘的な名前が欲しかったらしい(英語公式サイトのFAQより)。

  

しばらく前から、人気のプログラミング言語の代表で、今年度(2022年度、令和4年度)から高校で必修化された新科目『情報Ⅰ』でも注目されてる。

   

教科書の最大手・東京書籍だと、プログラミング言語の副教材は今のところ、Pythonのみ。教科書自体のプログラミングの説明でも、当たり前のようにいきなり最初からパイソンが使われてるほど。実教出版の副教材でも、PythonとJavaScriptのみになってる。

    

過去の流れから考えると、近い将来、また新しい言語に取って代わられると思われるが、とりあえず今はPythonを見ておこう。

   

   

      ☆     ☆     ☆

230228a

    

東京書籍の副教材は、編著・日経BP、発行者・東京書籍となってる。表紙のデザインから考えても、おそらく中身は日経BPによる執筆・制作だろう。2022年2月1日に初版発行だから、最新のもの。

  

B5版、96ページ、オールカラー、税込880円。薄さを考えると、安くはない。ただ、教科書本体の価格は安いので、副教材で利益をあげるのかも知れない。

 

と言っても、1つのプログラミング言語に絞った参考書だから、どれほどの生徒が購入するのかは不明。今後の大学入試での情報Ⅰの扱いも、まだよく分からない。参考書は他に多数あるから、一般人がこれを買うことも少ないはず。

   

230228b

    

冒頭から、オンライン学習環境を指定してある。「本書は Bit Arrow を使って学習を進めていく。Bit Arrow は、PCへのインストールなしにブラウザ上でプログラミングを学習できる・・・」。

   

ビット・アロー。キャラクターの可愛いリスが、矢(Arrow)を持ってる。大阪電通大、東京農工大、明星大学、3つの大学の研究室が共同開発したシステムとのこと。

   

便利で無料なのは非常に有難いとして、そもそもなぜ使用環境のインストールがもっと簡単に出来ないのか、不思議でもある。私自身、過去にJavaとVB(ヴィジュアル・ベーシック)で挫折した。説明通りに操作しても、何も導入できないまま、時間だけかかってしまうのだ。他のアプリでそのような経験はほとんど無い。

    

   

     ☆     ☆     ☆

230228c

   

とにかく、ビットアローの公式サイトにアクセス。「書籍のサンプルがエラーになる」。副教材に関するエラーの修正が、目立つ形で書かれてたから、全国の高校教員から指摘があったということか。

    

使用には登録が必要だから、メールアドレスとパスワードで登録。その後、左上の「Bit Arrow を起動!」をクリック。私はタブレット(旧iPad Pro)を使用したから、タップ。

    

230228d

   

230228e

    

230228f

   

プロジェクトとファイルを新規作成して、いよいよ副教材に従って学習開始。プロジェクトというのは、学校の授業の単位(1回とか1単元)を意識したものか。私の場合、後で修復しにくいエラーが生じてしまった時、2つ目のプロジェクトを作成すると直った。

  

  

     ☆     ☆     ☆

230228g

    

230228h

   

まずは、入力した文字の出力(プリント)から練習。シングル・クォーテーション(’)で囲めば、実行画面ダイアログに表示される。2つをコンマで区切って入力すると、同じ行にスペース(空白)を挟んで出力される。「実行」は、ブラウザを選択して行った。

   

入力文字は副教材だと「引数」(ひきすう)と書かれてるけど、その説明を読んでもほとんど意味は分からない。むしろ、「定数」とか「定字」とかいう方が、次に出て来る「変数」との比較を考えても分かりやすいと思う。

 

230228i

   

230228j

   

よくある「Hello World」の代わりに、「Hello Python!」。これが出来るということは、先ほどの def と ghi を、「’def ghi’」でひとまとめに入力してもよかったことになる。

 

   

     ☆     ☆     ☆

230228k

   

続いて上図は、name という変数に Taro を代入。name をプリントした様子。

   

230228l

  

後で、読者・閲覧者などに代入させたい時は、name=input() の形を利用。実行すると、上図の右下のようなダイアログ・ボックスが出るから、私の名前 Tenmei を入力。

   

230228m

   

すると、実行画面の1行目には、ダイアログの様子が表示されて、2行目がプリント出力になる。上では同じ Tenmei だが、ダイアログに質問文を入れると違って来る。

   

230228n

   

プログラムで input() の中に、引用符で「名前?」と入れておけば、ダイアログボックスの上側で「名前?」と表示。天命と入力すると、実行画面は下のようになる。

  

230228o

   

ちなみに、ダイアログボックスの下側の「ダイアログを表示しない」をタップしてみると、その後は入力できなくなってしまって、実行画面では null (無し)になってしまった。しばらく試行錯誤しても直らないから、仕方なく新しいプロジェクトを作り直して再開した。

    

   

      ☆     ☆     ☆

230228p

   

最後は、パスワード入力と正誤の判定。まず、pw という変数に、正しいパスワード Hello を代入。次に、読者などが入力する変数 ipt を設定。

  

もし(if)pw が ipt と等しければ、login ok (ログイン・オーケー)と表示。そうでなければ(else)、wrong password(誤ったパスワード)と表示。

   

if とか else で示される条件文の後の処理動作(上では print)は、半角スペース4コ空けてプログラミングする必要がある。ただ、このオンライン環境では、自動的にそのスペースを空けてカーソルが移動してくれた。

    

   

      ☆     ☆     ☆

いつも数ヶ月くらい、間が空いてしまって、ほとんど忘れた頃に勉強を再開してるから、最初は精神的に非常に疲れる。環境にせよ、書き方や動作にせよ、すべて相手任せ。何とか苦労して相手に合わせることになるから、数学とも似て非なる分野だ。

 

むしろ、論理学的な演繹(えんえき)の記述に似てる気がする。ともあれ、今日はそろそろこの辺で。。☆彡

 

   

  

cf. Python入門2~高校副教材とオンライン環境Bit Arrow、さらにAI(ChatGPT4)も使用

   

      (計 2526字)

   (追記53字 ; 合計2579字)

| | | コメント (0)

令和3年度、文科省・情報活用能力調査の調査問題例と正答(小中高、4年1~2月)、感想とレビュー

ネットを適当に飛んでたら、たまたま、文部科学省の情報活用能力調査のニュース記事を発見。軽い記事にちょうど手頃の内容なので、感想記事にしとこう。今週は月火の2日だけで7000字超も書いてるから、ごく簡単なレビュー。単なるまとめや紹介ではなく、批判も織り交ぜる。

     

221228ac

  

約1年前に行われた、情報活用能力の調査結果「の一部」が、令和4年(2022年)12月27日に公開された。小学5年生、中学2年生、高校2年生が対象。「速報結果」だから、後ほど詳しい分析も示されるのかも知れない。実際、前回の同種の調査(平成)については、詳しい結果が公開されてる。

     

ただ、今後の調査も考えて、基本的には問題は非公開とのこと。コンピューターを利用するCBT形式だから、小学生にとっては端末の操作だけでも大変。

  

問題には、小中高の共通問題が多いが、中高のみの問題もある。多数の問題から、生徒ごとに問題のセットを変えて出題。これでは、普通に考えれば、各生徒が異なるテストを受けたことになってしまうが、IRT(項目反応理論)によって「同一尺度で得点化」できるとのこと。

     

このIRTの信頼性や公平性に疑問を感じるが、その点はここでは省略。今回、公開された3問を見てみよう。どれも小中高の共通問題。

      

時間は30分×2とだけ書かれてるが、その時間で何問解くのかも公開すべきだろう。情報処理では速度が大切で、人それぞれの差も開く。1人あたりの問題数さえ公開したくないということだろうか? 受験者や実施した学校は把握してるはずだから、それで十分だと。配点も総得点の計算方法も書かれてないのに、総得点の分析だけかなり詳しく公開されてる。

   

   

      ☆     ☆     ☆

では、調査問題例1。環境問題のウェブページの正確な理解。

      

221228b

      

221228c

    

221228d

   

残念ながら、5項目のリンク先の内、最初の1項目である「オゾン層の破壊」しか公開されてない。要するに、これだけで正しい選択肢が1だと分かる、と担当者は考えてるのだろう。2~5の選択肢は明らかに間違い、という考えもあるのかも。

   

ポイントは、最後の1文。「フロンガスは温室効果ガスでもあり、地球温暖化を防ぐためにもフロンガスの規制は重要です」。これを読んで、最も適切な選択肢が「フロンガスは地球温暖化をもたらす」だと判別させる。

   

既に、環境の知識をかなり学んでる中高生ならともかく、小5の生徒には内容自体が分かりにくいと思うし、項目名と選択肢の内容もズレてる。この量の説明があと4項目分もあるのなら、情報量も多過ぎ。社会人でも、それら全体の説明を正確に理解する機会はかなり少ないはず。クリックして、全員にすぐリンク先が表示されたのかどうかも気になる所だ。

    

正答率は、小学生32%、中学生58%、高校生73%。小数点以下は、引用者が四捨五入。3問中、この問題で最も小中高の差が開いてるのは、環境問題の知識が響く問題だからだろう。

      

   

     ☆     ☆     ☆

次に、調査問題例2。明るさセンサーのプログラム(フローチャート)の完成。将棋の藤井五冠王を意識してるのか、「聡太」が主人公。

       

221228ec

    

221228fc

      

これは、AとBの両方が合ってる場合のみが正解だろうか? 結果に明示されてないが、正答率が2つに分かれてないので、そう考えるのが自然か。正答率は、小学生41%、中学生62%、高校生69%。高校生の低さがやや目立つ。

   

おそらく、間違いの多くはBだろう。明るさセンサーが「明るい」と感知した時、「ライトが消える」を正答としてるが、問題文にそのような事は書かれてない。「暗くなったらライトが光る」と書かれてるだけだから、不十分か不親切な問題文だと感じる。

  

それ以上に間違いを増やしてしまったのでは?と思われるのは、センサーとライトを分けてること。家庭向けだと、それらは一体化されてるのが普通だろう。そう思ってる生徒にとっては、AもBも「明るさセンサーが・・」と書かれたカードを選んでドラッグするのは自然なこと。そちらが先に挙げられてるし、問題文の主体もセンサーだし、時間がないからだ。

     

私が出題者なら、問題文に、センサーとライトが別物であることを明記。また、「暗くなったらライトが光る」ではなく、「暗いならライトが光り、明るいならライトが消える」と書く。

    

「暗くなったら」と「暗いなら」が別の条件だということ、「暗いなら」の方が明確だということは、日常言語の論理における基本的知識だろうが、正確に理解・区別してる人は少ない。

  

   

     ☆     ☆     ☆

最後に、調査問題例3。フォルダの正しい理解と選択

    

携帯端末(スマホ、タブレット)を軽く使ってるだけの生徒だと、フォルダ自体が分かりにくいはず。フォルダではなく、「アルバム」という名前で呼ばれてることも多い。

    

例えば、iOSの「写真」アプリも、Androidの「フォト」アプリも、「アルバム」という名前を使ってる。デスクトップのフォルダの中のフォルダ、という三重の入れ子構造も、基本的にPCの特徴だろう。携帯端末では、二重の構造を使う程度。

     

221228gc

    

221228hc

  

これは、旅行フォルダを開くだけで正解と判定されるのだろうか? 正答には、「『旅行』フォルダを開いた状態で『次へ』ボタンが押されているもの」と書かれてるが、問題文には、「進む」を押してくださいと書かれてる。

   

「次へ」と「進む」の関係の曖昧さが気になるが、正答率は高いから、誤解は少なかったのだろう。小学生52%、中学生76%、高校生84%

  

   

      ☆     ☆     ☆

以上、情報活用能力を求めることも、調査することも正しいと思うが、問題や調査、公開には気になる点も多かった。今後の改善に期待しよう。

  

1人1台の学校用タブレットが確保されてる場合、PCとは別に、タブレットの調査もあっていい。それに対して、スマホは個人的な物だから、調査には使いにくいかも知れない。

  

なお、キーボードによる1分間あたりの文字入力数は、小学生16文字、中学生23文字、高校生28文字。3分間で、総文字数285文字の入力を求めたそうだが、これも具体的な入力内容が全く書かれてないので、何とも言えない。

  

あまり入力が速くないのは確かだろうが、漢字が多いとか、英字の大文字・小文字・半角・全角の切り替えが多いと、面倒だと思う。入力しにくい記号もある。多数の変換候補が並んで、下の方でようやく表示されるとか。数字の半角・全角の区別は微妙だが、正しく指示されてただろうか。

    

ともあれ、いつの間にか長くなったので、今日はそろそろこの辺で。。☆彡

   

      (計 2649字)

| | | コメント (0)

C言語入門5~選択構造、if文、else、switch-case文による多岐分岐

超初心者が1年がかりでのんびり続けて来た、C言語のプログラミング入門。さすがにそろそろ、高校の教科書『新情報技術基礎』(コロナ社)の終わりが近づいて来た。問題の答となるプログラミング例がほぼ書かれてるので、自分なりに少しアレンジしたプログラムを作りながら練習。

  

利用してるありがたいサイトは、プログラミング用の「環境」をネットで無料で提供してくれてる、paiza.io。自分で環境を構築する作業は何度も失敗してるので、またいずれ。構築の説明はあちこちにあるけど、自分のPCで試すとなかなか説明の通りにならない。JAVAは何かが足りないとか言われて導入できず。Visual BASICは重すぎて断念。

        

今日使ったのは、教科書の第5章・C言語によるプログラミング、第5節。選択構造(p.135~140)。6ページとはいえ、少しずつ難しくなって来たので、精神的に疲れる。おまけに、前の話は次々と忘れて行くので、再び調べるのも時間がかかる。

    

選択構造とは要するに、場合分けの仕組みのこと。「もし何々なら・・・、そうでなければ~~~」とか、「この場合は・・・、その場合は~~~、あの場合は***」とか。選択や反復がない、一番シンプルな流れだ。一応、7年前にQuick BASICを使って記事を書いてるが、ほとんど覚えてない。

   

  

     ☆     ☆     ☆

ではまず、例題5.8。点数を1つ入力して、もし70点以上なら「合格」、そうでなければ「不合格」と表示するプログラム。

      

211120a

  

If(  )で条件文「tensuu >= 70」を書いた後、基本的には{  }で処理(命令文)を書くけど、処理が1つだけなら{  }は省略可能。私はこの{  }とか、プログラミングに多用する記号が苦手になってるので、上では省いてる。;(セミコロン)も本当は打ちたくない。

   

ただ、「以上」を「>=」と書くのは、普通の記号の「≧」を左右に2分割するだけなので、あまり抵抗ない。「等しい」を「==」と書くのも、何とか我慢の範囲内。入力しやすいし、意味も明らかなので。

     

211120b

  

点数として80を入力して実行すると、合格と表示された。2行に分けて表示する方法はしばらく後で発見。教科書はそうなってないので、考えてなかった。

      

211120c

  

  

      ☆     ☆     ☆

続いて、問10(1)。整数を1つ入力して、もし2で割った余りが0なら「偶数」、そうでなければ「奇数」と表示するプログラム。

  

表示するものをprintf(  )で指定、入力するものをscanf(  )で指定するのも、少し慣れて来た。普段はほとんど使わない二重引用符も、ようやく少し馴染んで来た感じか。整数の割り算の余りは、「%」という記号で計算。

           

211120d

   

14を入力して実行すると、「偶数」と表示された。

   

211120e

   

この環境だと、入力と出力を同時に見ることができないのが玉にキズ。もしかすると設定でどうにか出来るのかも。

       

211120f

  

  

     ☆     ☆     ☆

さらに、問10(2)。三つの整数値を入力して、最大値を表示するプログラム。最初に入力した数を暫定的に最大として、もし、次に入力した数がそれより大きければ、次に入力した数の方を新たな最大にする手続き。こうした、少しずつ比較するパターンは、小学生向けのプログラミング問題集でも出て来てた。

      

211120g

   

25、10、50を入力すると、確かに50という最大値が表示される。

   

211120h

      

211120i

   

  

     ☆     ☆     ☆

少しだけ変えて、4つの整数値の中から最小値を表示するプログラムも自分で作成。25、10、50、80を入力すると、確かに最小値10が表示された。

      

211120m

  

変数にn4を加えて、最大値maxの代わりに最小値minを導入して、ifの条件文の不等号の向きを逆にするだけ。

   

   

      ☆     ☆     ☆

次は、3つ以上の方向に分かれる「多岐分岐」(たきぶんき)。合成語の意味はすぐ分かるけど、4文字の一まとまりとしては聞いたことのない日本語だ。条件は、if、else if(前の条件とは違って、もし・・・、という意味)、else(それら以外の時)で表す。

      

ここでは、2次方程式 ax²+bx+c=0 の実数解を求めてる。もし判別式d=b²-4acが0より大きいのなら、異なる2つの実数解。もしd=0なら、1つの重解。それら以外(つまりd<0)なら、「解なし」と表示。

  

実数や数学の関数sqrt(平方根の計算:スクエア・ルート)を使うし、命令も少し長くなるから、ここまでの問題より難しい。2行目に「#include <math.h>」と書いて、5行目の変数の型はfloatにして、入力の型は%fにする。

        

211120n

  

高校数学でお馴染みの係数、a=1、b=-5、c=6を入力すると、「解は 3.000000 2.000000」と表示された。普通に「解は 2 3」とか表示させたいけど、とりあえず保留。

      

211120o   

   

211120p

   

その代わり、解の公式の分母の数を、2.0ではなく、2にしてみたら、大丈夫だった。係数として、a=1、b=4、c=4を入力すると、表示された答は重解-2.000000。

      

211120q

   

   

      ☆     ☆     ☆

最後に、もっときっちり並列的に多岐分岐を行う、switch-case(スウィッチ・ケース)文の問題。例題5.10。

  

相手が日本語を示す番号1を入力した場合は、「こんにちは。」と出力。英語を示す番号2を入力した場合は、「Hello!」と出力。フランス語を示す番号3を入力した場合は、「Bonjour!」(ボン・ジュール)と出力。ちなみに教科書の3番目は、ドイツ語「Guten Tag」(グーテン・ターク)になってたから、私が変更した。

      

211120r

   

switch(変数){case 変数}・・・break(ひとまず終わり)の形で、3つ以上の場合を並列的に分ける。「それ以外」のようなオマケ的な扱いは目立たなくて、最後の「default」の所のみ(ここではbreakは不要)。多様性とか対等性、中立性、共存が叫ばれる今の時代だと、特に重要だろう。 

      

211120s

  

2と入力して英語を指定すると、「Hello!」と出力された。ここでようやく、最後の出力で改行する方法を発見。前半のprintfの最後で、(”? /n”)としておけばいい。キーボードによっては、「/n」ではなく、「¥n」。

      

211120t

   

  

     ☆     ☆     ☆

最後に、switch-case文ではなく、if else文で同じ処理をプログラムすると、成功した。やはり、実質よりも、形とか外見の問題が大きい構文なのか。

       

211120u

   

というわけで、あと2回くらいだから、出来れば年内に終わらせたい。それでは今日はこの辺で。。☆彡

    

        (計 2608字)

| | | コメント (0)

将棋AIも採用、ミニ・マックス法の無駄を省いた α β(アルファ・ベータ)法と α 値、β 値の具体例の解説

将棋界では、19歳の天才・藤井聡太四冠の勢いが止まらない。彼の強さを説明する時、よく持ち出されるのが、AIとか、ディープ・ラーニングという話だが、普通のメディア情報だと、そうした言葉だけ使って、中身を説明してないものがほとんどになってる。

   

まだAIも、全ての変化は読み切れないので、途中で読みを打ち切って、一方がどれだけ有利・不利なのか、形勢判断することになる。途中でどのように形勢判断するのか? どのように評価値を計算するのか?

   

ある1つの局面だけを取り出して、先は読まずに、その時点だけでどう評価するのかについては、特殊なソフト(評価関数)が色々あるようで、そこはとりあえずスルーしとこう。

   

今回は、先を少し読んだ上で、今現在の評価値を出す方法、コンピューター手続き(アルゴリズム)について解説してみる。あちこちに説明があるが、導く途中のプロセスが書かれてないものや、言葉の意味(ミニ、マックス、α値、β値)を具体的にハッキリ示してないものがほとんどだった。

   

そんな中で、最も役に立ったのはいつものように、英語版ウィキペディアの説明(minimax、αβ pruning)。特に、図やアニメは明らかに優れてる。他に、補助的に役立ったのは、近大の石水隆氏のpdfファイルだった

    

    

        ☆     ☆     ☆

下は英語版ウィキのαβ簡略化法の図だが、これを用いて、元になってるミニマックス戦略から説明する。

    

将棋、碁、チェス、オセロなど、1対1のボードゲームだと、一方がどれか1手を選んで指して、それに対して、相手がいくつかの選択肢から選んで応じる形になる。その変化を樹形図(ツリー)として示したのが下図。グレー(灰色)の意味は、しばらく後で説明。

        

211118a

    

一番上の自分の手番では、3つの選択肢(丸印)があって、これから自分が最善の手を選ぶ。そのそれぞれに対して、相手には2つの選択肢(四角印)がある。一番下に並んでるのはすべて、自分の側に対する評価値。相手は当然、この値から出来る限り低いものを選ぼうとするはず。

  

ちなみに将棋の最初の局面なら、下のような変化をまとめてることになる。自分には、7六歩、2六歩、5六歩という3つの選択肢がある。そのそれぞれに対して、相手には、8四歩、3四歩という選択肢がある。

   

211118b

   

   

     ☆     ☆     ☆

211118c

  

さて、相手としては、自分(私)の評価値を下げたいから、最も低い値(ミニマム)になる選択肢を選ぶと考える。例えば上図の左端だと、評価値5と6の変化があるから、相手は5の選択肢を選ぶ。以下、同様で、それぞれの相手の手番における自分の評価値がまず決まる。

   

上図で、下から2段目の薄い黄色のエリアには、左から、5、4、3、6、6、7、5、8、6という値が並んでる。これは、私がその直前に選んだそれぞれの選択肢(丸印)に対する評価値ということになる。自分(私)は当然、それらの中から、なるべく大きい値(マックス)を選ぶ

   

211118d

  

だから、上図のように、下から3段目の私の手番では、私が大きい値の選択肢を選んだと考えてる。左端の分岐点なら、5と4の内、5になる選択肢を選んだということ。右端なら、8と6だから、8になる選択肢を選んだ。

   

この時点で、下から2段目の薄い青緑のエリアには、左から、5、3、6、7、5、8という値が並んでる。これは、相手のそれぞれの選択肢に対応する、自分(私)の評価値ということ。

  

ちなみに、それぞれの点(局面)は、英語でカタカナ英語でノード(node)と呼ばれてる。普通は分岐点のことだが、決着がついた最後の局面は分岐点ではないし、指し手が1つしかない時も分岐点にはならない。

   

   

     ☆     ☆     ☆

相手はまた、自分(私)の値を低くする選択肢を採用すると考えると、下図のようになる。中央の変化だと、6と7だから、小さい6になる選択肢を取る。

   

211118e

   

最後に、自分は、3、6、5と並ぶ数字から、一番大きい6になる中央の選択肢を選べばよい。したがって、最初(一番上)の時点での評価値は、6ということになる。自分の指し手を青い線、相手の指し手を黄色の線で示した。自分の2回目の指し手は2通りあって、どちらでも同じ評価になってる。

  

211118f

  

なお、相手だけが間違えた場合は、評価値は9まで上がる可能性がある(6から一番下の段まで下りた時の、最大の値)。一方、上図の場合は、自分が間違えたとしても、最悪の評価値は6(上側の6から一番下の段まで下りた時の、最小の値)。

   

   

      ☆     ☆     ☆

上のような方法が、ミニマックス戦略。相手は、自分(私)の評価を最小(ミニ)にすると考えて、自分は評価を最大(マックス)にすると考える方法。ちょっと難しい言い方だと、自分の最悪の損害を、最小化する戦略。歴史的には、一般的なゲーム理論やナッシュ均衡まで遡るらしい。

  

もちろん、実際の人間がそのような最善の判断をするかどうかは分からないし、そもそも一番下の段の評価値が正しいとも限らない。AIも最後の終局・投了まで読み切ってるわけではないし、人間との形勢判断の違いも大きい。

   

とにかく、そうしたミニマックス法から、無駄な読みを取り除く(prune:プルーン)方法が現在、使われてるらしい。α値、β値というものを使うから、英語だと αβ pruning。日本語だと αβ 法が普通の言い方だけど、意味的には αβ簡略化法ということだ。

  

  

      ☆     ☆     ☆

AIは左から右へと計算していくと仮定。まず、左下の枝分かれを見てみよう。

   

211118g2

   

相手の手番である下から二段目で、左端に、自分の評価値としてまず5が出てる(赤丸)。この時点では、これがα値。その上の段階で、自分は、この5より小さい値は選ばないはず。

   

ところが、右へと計算していくと、一番下の段が4となった時点で、その上側の評価値も4になる。この後、上のグレー(灰色)の値が何であっても、すぐ上の値は4以下になる。相手はなるべく小さい値を選ぶから。

  

α値と同じ段の右側に、α未満の値が出た瞬間、その後の下側の計算はもう不要になる。自分(私)はその直前の段階で、α値の選択肢を選ぶ方が得だから。したがって、上の枝分かれだと、自分は下から二段目の左側の5の選択肢を選ぶことが決定する。赤い斜線の右下は計算不要でカット。

   

211118h

   

同様に、中央の枝分かれでも、赤線の右下は計算不要で省略される。下図を参照。ここでのα値は、とりあえず6(下から二段目の左側)。右下の灰色のマス目の値が何であっても、すぐ上の値は6以下だから、自分の選択肢の値は6と決定。

          

211118i2

  

ただし、この場合は2通りの変化が同点になってる。これは将棋AIでも見られる現象。

   

   

      ☆     ☆     ☆

最後に、β値については、この樹形図だとたまたま役に立ってない。

   

211118j

  

上図で、下から二段目の自分の手番において、左端にまず5と出てる。これが最初の時点でのβ値で、これより大きい値が同じ段の右側に出たら、その後の下側はカットされるが、β値より小さい3が出たので、何もカットされてない。

  

中央の枝分かれは、そこでのβ値6より大きな値が出てるが、その後にカットされるべき選択肢がないので、たまたま役に立たない。右端の枝分かれは、β値5によるカットを使う前に、上から二段目のα値(ここでは6)が働いて、下側の3段が丸ごとカットされてしまう。

  

211118k

   

   

     ☆     ☆     ☆

仮に、右側の枝分かれの5の代わりに7とすれば、下図のように、β値を上回る値が出た後の下側のカット(省略)が生じる。

    

211118l

   

それにしても、もともと一番下の段の評価値が間違っていたら、ミニマックス法もαβ法も意味が無くなってしまうはず。今後、その辺りも調べてみたいが、将棋だけでも1通りではないから大変かも。

  

ともあれ、今日のところはこの辺で。。☆彡

    

       (計 3134字)

| | | コメント (0)

C言語入門4~変数の入力と計算、型指定子 int(整数型)、float(実数型)、順次構造

先日、約1年ぶりにアプリで復習した後、今日は高校の教科書『新情報技術基礎』(コロナ社)を使用。答のプログラミング例がほぼ書かれてる問題で、自分なりに少しアレンジしたプログラムを作って練習した。

  

利用したのはネットで無料で環境を提供してくれてる、paiza.io。ありがたいサイトに感謝。自分で環境構築を行う作業は何度も失敗してるので、またいずれ。自分のPCで試すと、なかなか説明の通りにならないのだ。

   

今日使ったのは、第5章・C言語によるプログラミングの第4節。変数と順次構造(p.130~134)。5ページしか進まなかったのは、何度も間違えたり考え込んだりしたから。既に前の箇所に書かれてた内容は、あらためて説明してくれないから、自分で前のページに戻って復習する必要がある。

  

順次構造とは難しげな用語だが、要するに順番に次々と進む仕組みのこと。選択や反復がない、一番シンプルな流れだ。選択や反復については一応、7年前にQuick BASICを使って記事を書いてるが、ほとんど覚えてない。

   

  

     ☆     ☆     ☆

211028a

   

まず、例題5.6(5章の6問目)。長方形の縦と横の長さを整数で入力して、面積を整数で出力するプログラム。上図は、教科書に載ってるものとほぼ同じで、面積を s と書く代わりに、そのまま menseki としたもの。もちろん、縦×横。

   

4行目の先頭の「int」が整数型の指定子で、変数 tate、yoko、menseki が整数だと宣言してる。私が苦手なのが6行目の入力設定。%dと%dの間にコンマがないのが引っかかるし、カッコの前半だけ引用符に入ってるのも分かりにくいし、その右の変数名に & が付いてるのもなじめない。

  

5行目で、改行を表す「逆スラッシュ+n」を入れてるが、教科書には付いてない。たぶん、同じC言語の中にも、細かい違いがあるということだろう。

    

211028b

   

下の「入力」という所をクリックして、半角スペースを挟んで、半角数字の 7 と 9 を入力。「実行」すると、確かに面積 63 が表示された。

         

211028c

   

  

      ☆     ☆     ☆

211028d

   

続いて、円の半径を入力して、面積を出力するプログラム。円周率3.14×半径×半径。半径を表す変数は、そのまま hankei 。面積は menseki。ちなみに教科書は、r と s になってる。

  

これは円周率が小数だから、変数は実数型の指定子 float を使って宣言(4行目)。なるべく教科書を見ずに入力したら、何度もコンパイル・エラーが表示されて、挫折しそうになった。半径を入力する6行目で、hankei の前の & を忘れてたのだ。エラー表示の英語はもっと分かりにくい書き方だったので、意味が分からなかった。

  

半径 5 を入力して実行すると、出力は 78.500000。確かに、3.14×5×5の値になってる。

    

   

     ☆     ☆     ☆

211028e

  

3問目は、問7。上底(じょうてい)、下底(かてい)、高さを入力して、台形の面積を計算するプログラム。(上底+下底)×高さ÷2。

  

教科書だと、30、20、10 を入力するだけだから、答は (30+20)×10÷2=250。整数型でもいいはずだけど、面積の答は 250.000000 と与えられてるから、実数型(この教科書では float)を宣言。÷2が入ってるし、小数になることが多いからか。ちなみに、この教科書では、より詳しくて実用的な実数の型指定子、double は使ってない。

  

この3問目でようやく、わりとスラッと書けたから、気を良くして次へ。

    

    

      ☆     ☆     ☆

211028f

  

4問目は、整数どうしの割り算(除算)を行った時の、商と余りに関する問題(例題5.7)。与えられた金額を、10円玉と5円玉と1円玉を使って、なるべく少ない枚数で作りたい。要するに、なるべく10円玉を使って、次になるべく5円玉を使えばいい。変数は、ここではそのまま、kingaku、coin10、coin5、coin1。

      

まず、金額を10で割った商が、10円玉の枚数。ここでは 47 円だから、/10 の計算結果 4 を使って、10円玉は4 枚。次は、その割り算の余り(ここでは 7)を 5 で割ればいいから、余りを出す記号 % を使って、coin5=(kingaku%)/5 。そのまた余りが1円玉だから、coin1=(kingaku%10)%5 。

   

211028l

    

ちなみに教科書のプログラムは、最初に10で割った後、金額を変更する形になってる(上図)。私は不自然だと感じるけど、なるべく単純な計算式にしたかったということか、あるいは勉強のためか。

  

とにかく、47 円を入力して「実行」すると、10円玉 4 枚、5円玉 1 枚、1円玉 2 枚が出力された。

       

211028g

  

  

     ☆     ☆     ☆

211028h

  

最後、5問目は、総秒数(全体の秒数)を入力して、何時間何分何秒かを表示するプログラム(問9)。これも、私と教科書とで発想が違ってた。

  

上が教科書のやり方で、まず秒数(second)を 60 で割って、分(minute)を出す。その割り算の余りが、新たな秒。さらに、分を 60 で割って、時間(hour)を求め、その割り算の余りを新たな分として定義し直してる。確かに、3670を入力すると、1時間1分10秒と出力される。

            

211028i

  

しかし、私なら下のように書く。これなら、分の定義変更が無くて1行少ないし、日本語の順番(時間、分、秒)に求める形になる。式がほんの少し複雑になるだけ。

       

211028j

   

なお、最後に試しに型指定子を実数型の float に変えてみたら、余りの計算の行2つにバツ印が付いてしまった。なるほど、商と余りという計算は、整数型のものなのか。このコンパイル・エラーはわりと分かりやすい英語表示になってた。second%3600 の % は不適当だという警告。

          

211028k

    

ちょっと思い出したから、なるべく早めに先に進みたいと思ってる。今日のところはこの辺で。。☆彡

    

          (計 2344字)

| | | コメント (0)

超初心者によるC言語入門3~情報系学科の大学生が1年生向けに作った学習アプリ『Study-C』で復習

また、ずいぶん時間が空いてしまった (^^ゞ 1本目の記事を書いたのが、20年10月24日。2本目の記事は21年1月12日。それからの9ヶ月間、C言語も含めて、プログラミングにはほとんど触れてない。先月、数学の未解決問題「コラッツ予想」の記事を書いた時、BASICにちょっとだけ触れた程度。

    

どうも、イップスというか、身体と心が固まって動かなくなってしまうのだ。数学や文系の話なら、難しくても拒否反応はあんまし無いから、やっぱりプログラミング独特の性質が壁になってる。

   

今回、久々に高校の情報の教科書を開いたものの、無味乾燥でシンプルな記述を読む気がしなかったので、App Storeを拝見。「C言語」で検索すると、トップに表示されたのが、「Study-C」という学習サポートアプリ。iOS専用なのか、AndroidスマホでPlay Storeを探すと出て来なかった。

      

211016a

   

サイズも軽くて、評価も高いけど、これは確か去年、インストールしてすぐ使わなくなった覚えがある。別のサイトのpaizaを実行環境にすることを勧めてたから、そっちに移って、このアプリは放置プレイになってた。

   

今日、あらためて最初からマジメに見て行くと、なかなか親切でフレンドリーで読みやすい(個人の感想♪)。大学院生が作ったのかな・・と思ってたら、情報系の学科の大学生だった(2年前?の当初は)。しかも、同じ情報系の大学1年生をターゲットにしてるとのこと。

       

単なる超初心者にはどうかと思ったけど、今のところは大丈夫。このまま一気にラストまで行きたいけど、今まで続いた試しはない♪ 高校の教科書もまだ序盤だし、昔、別の教科書でBASICをやってた時も、惜しい所で挫折してしまった。教科書が行方不明になったのだ♪ まあ、その程度の扱いということか。。

  

  

     ☆     ☆     ☆

211016b

  

上が最初の目次の画面。はじめに、始めよう!C言語、C言語ドリル、コラム。まん中の2章が中心的内容。ただ、超初心者にとっては、下のような実行環境の話に好感を抱いた。

       

211016c

    

プログラムの実行環境を作る、環境構築が、わかりづらく面倒臭い。まさに、その通り! あるあるで、私も何度も書いて来た。他の言語でも、そのスタート地点でいきなり躓いて来た。しかし、この製作者が挫折したのは中学生の時。さすがに早い。私だと、数学と将棋とテレビアニメにハマってた頃か。ランニングもたまに1人でやってた。

    

ちなみに、この製作者が勧めてた環境は、EasyIDEC。検索するとメジャーらしいけど、逆に批判の言葉もあちこちに出て来た。今でも更新し続けてるみたいだし、いずれ使ってみようと思う。最初の紹介を読んだ限りだと、ちょっとクセがあるようだ。まあ、マニアック・ブロガーの私が言うのも何だけど♪

   

    

      ☆     ☆     ☆

211016d

   

で、第2章(または第2部)の、始めよう!C言語。最初はおなじみの「Hello World!」。キー入力ではなく、単なる並べ替え問題なのに、いきなり私は失敗。コンパイラ・エラーが表示されてしまった。

        

211016e

    

Hello Worldをくるむ二重引用符の中に「\n」を入れるのに、右外に出してしまったのだ。ホント、コンピューターは融通が利かないね♪ そもそも、この改行の \n。意味も必要性も分かりにくいし(特に最後の\n)、逆スラッシュが入力できないこともあるのでイラついてしまう。

          

211016f

   

言い訳やボヤキはともかく、やり直して、「正解です!!」。アプリは教科書と違って、正解だと言ってくれるから嬉しい。誉め言葉が付いてると、もっと嬉しくなる♪ 大人になると、褒められる機会が滅多にないもんで。

   

   

     ☆     ☆     ☆ 

続いて、足し算の答を表示するプログラム。まだまだ、完全な復習の話に過ぎないけど、完全に忘れてる♪ ちなみに冒頭の「printf.c」というのは、C言語で書いた、printf(表示機能)のソースプログラムという意味らしい。

   

と言っても、ソースプログラムというものがまたモヤモヤしてしまうけど。以下のプログラム画面を表示するためのプログラムという意味かな? C++(シー・プラプラ)のものだと、右端の拡張子の部分にppが付いて、printf.cpp とかになるようだ。

    

211016g

    

この「%d」も好きになれないし、記述子とか、フォーマット指定子という特殊な用語も苦手 (^^ゞ それならむしろ、英単語の decimal (10進数)の方がスッと受け入れられる。

       

211016h

   

printf("%d,%d\n", 3+4, 5);  このプログラムの実行結果を答えよ。これは、7,5 だろう。直感的に♪ いや、本のアイコンを押すと、解説に戻ることも可能。

    

211016i

  

Hello\n と改行して、printf("World!!\n"); と下に書き足すと、HelloとWorldが2行で表示されると。ちゃんと6行目に、「//最後に\nを付けてね」とヒントを挿入してくれてる♪

    

211016j

    

  

     ☆     ☆     ☆

そして、いよいよ変数の登場。

    

211016k

   

整数型のaという名前の変数を宣言せよ。定義とか導入ではなく、宣言ね♪ 選択パネルが下にあるから、int a; と並べ替えるだけ。その下の a=1; は働かず。int は、整数を表す英単語 integer の略語。日本語で「整」と入力するプログラミング言語は無いのかね?

       

211016l

   

画面に4と表示させるプログラムを完成させよ。 int a; の次の6行目に、a=4; と入力するだけ。この右端にいちいち付けるセミコロンも、省略するプログラムは無いのかね?

       

211016m

  

上は、変数の宣言と、数値の代入を同時に4つ行ったプログラム。a=1, b=2, c=3, dの4つを導入して、さらに result (計算結果)も宣言。最後に、d=b; と定義・・ではなく代入して、result = a + b + c + d; の表示。1+2+3+2 だから result=8と表示される。

   

一応、上のプログラムだけ、paizaで自分で入力。確かに正しく出力された。

  

211016o

   

   

      ☆     ☆     ☆

211016n

   

早くも最後に、いきなり整数の計算式で、result = 6/2*(1+2) 。これはウチでも前に記事にした気がする、有名問題。6÷2(1+2)=6÷6=1と答えるのが、典型的な誤答だけど、式そのものがおかしいという異論もある。6÷2(1+2) という式の書き方は見ないから。

     

このプログラムでは、アスタリスクを入れて 2*(1+2) としてあるから、6÷2×(1+2) という計算。答(出力結果)は9。

   

あぁ、こんな初歩的レベルでもう時間切れになってしまった (^^ゞ 次はもう来年か♪ いや、今月中にまたプログラミング記事を書きたいと思う。こんな所で手間取ってるようでは時代に取り残されてしまうのだ。ではまた。。☆彡

     

       (計 2706字)

| | | コメント (0)

未解決問題「コラッツ予想」と確認用プログラミング(BASIC)~2011センター試験・数学ⅡB

たまに忘れた頃にプログラミング記事を書こうとすると、いつも最初の入口で引っかかる。コード入力して実行する、環境を作れないのだ。

          

今回だと、(少し前の?)高校数学で使われてた言語、BASIC(ベーシック)を使う環境がなかなか見つからない。今さら古過ぎるということか? 1つ前のPCにはインストールしてたけど、今のPCに新たにインストールするのも面倒。

   

そこで最初に試したのが、iOSアプリの Learn BASIC Programming。スイスイ使えていいと思ってたら、「ある数を超えない最大の整数」を表す INT 関数が使えないようで(?)、エラー表示が出る。解決策も発見できず。

     

次に試したのが、パソコンのブラウザで使えるはずのウェブ上のサービス、Quite BASIC。これはなぜか、コードの1行目の「INPUT N」が読めないとか言って来た。

    

これだけでもう、大量の時間とエネルギーを使い果たしたので、とりあえず自分でプログラムを書いて実行するのは断念。与えられたコードの画像を利用するだけにしよう。

☆追記: 翌朝、PCに十進BASICをインストールして成功。この記事の末尾にプログラムの画像を挿入した。)

   

   

     ☆     ☆     ☆

今回の記事のキッカケは、ネットで見かけた数学の懸賞金問題。1937年に数学者コラッツが提示した「コラッツ予想」(Collatz conjecture)に、日本のベンチャー企業から1億2000万円の懸賞金がかけられたとのこと。下の写真は英語版ウィキペディアより

  

210910b

     

それは7月の話だが、昨日は別の「ブレイクスルー賞」で、日本人2人がそれぞれ賞金300万ドル(3億3000万円)を獲得したニュースが流れてた。数学部門では、京都大学の望月拓郎教授(ABC予想関連の望月氏とは別人)。

   

望月拓郎氏の研究内容は、少しだけ調べてみた所だと、意味不明な言葉・概念が並んでいて、残念ながら全く理解不能。

   

それに対して、コラッツ予想は小学3年生くらいでも分かるし、計算実験で楽しめるはず。

   

 「どんな正の整数でも、偶数なら2で割る、奇数なら3倍して1を足す、という操作を繰り返せば、必ず1に到達するだろう。

   

  

     ☆     ☆     ☆

実際に試してみると、意外なほど長いプロセスになることもある。例えば、7なら、7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1。操作数は16回。

  

英語版ウィキペディアによると、2020年頃の段階では、10の20乗を超える所までコンピューター計算で確認されてるらしい。

     

ちょっと似た話なら、何度か聞いた気がする。例えば、6年前の人気ドラマ『デート』第9話では、「どんな数字も各位の2乗を足すと1か89になる」というコネタが挿入されてた

     

直感的には、コラッツ予想は簡単に示せそうな気もするが、提示から84年も経つのに未解決。ただ、ネットのあちこちに、センター試験に出題されたという情報があったので、すぐ問題ファイルを手に入れて解いてみた。

  

それが数学ⅡBの選択問題で、プログラミング関連。私が見た範囲では、どのサイトも、プログラミングの部分を飛ばして最初の導入だけ紹介してたので、ここでは本題のプログラミングも扱う。

    

   

     ☆     ☆     ☆

それでは、2011年のセンター試験問題を見てみよう。「日本の学校」HPよりダウンロードさせて頂いた

  

210910a

   

210910c

    

まず、簡単な(1)を解いてみる。

  

 6→3→10→5→16→8→4→2→1

 ∴ F(6)=(6から始めて1が得られるまでの操作回数)=8 ・・・アの答

  

 11→34→17→52→26→13→40→20→10→5→16→8→4→2→1

 ∴ F(11)=(11から始めて1が得られるまでの操作回数)=14 ・・・イの答

   

   

     ☆     ☆     ☆

この先は、環境作りの失敗で時間も無くなったので、穴埋めや選択肢を飛ばして、直ちに正解のプログラムを見てみよう。

   

210910e

210910d

  

     ☆     ☆     ☆

まず、最初の100番の行で、調べる自然数Nをインプット。問題(1)なら、6とか11。

   

次に110行で、Iという変数を用意して、最初はNの値をそのまま代入。操作が進むと、Iは変化していく。

  

一方、120行で、Cという変数(回数のカウント用)も用意して、最初は0を代入。1回の操作ごとに、+1で回数を増やしていく。

  

130行からが実質的な操作。まず、I=1なら、直ちに210行まで飛んで、F(1)=1と表示。

  

140行と150行は、もし「Iが偶数」なら2で割ったものをIとする、という条件を、「INT(I/2)×2=I」と書いてる。

  

これは、Iが奇数だと成り立たない。例えばI=3の時、INT(3/2)×2=1×2=2になって、条件を満たさず、180行に進むことになる。

  

160行は、1回の操作ごとに、回数Cに1を加える操作。170行は、「もし」という条件の終了。

  

180行は、1でもないし偶数でもない奇数Iに対して、3倍して1を加える操作。

  

190行で、回数1を加えた後、200行で130行までバックする。I=1になったら終了。

  

210行で、結果の表示。F(N)=C。NとCはここまでに登場した変数の値で、他は単なるアルファベットの文字とカッコの記号。

  

220行で、すべて終了。

   

   

     ☆     ☆     ☆

さらに、ある自然数M以下の自然数Nのうち、F(N)≦10となるすべてのNについて、F(N)の値を出力するプログラムへと書き換える。

   

最初と最後の辺りだけ少し変更して(下の青枠)、次のコードが正解。101行のFOR TO文で、N=1からMまでの実行を宣言。211行のNEXT Nで、次の数Nの操作へと進んで行く。PRINT(表示)は、C≦10の時だけ(210行)。

         

210910f

210911g2

   

これによって、次の8行が表示される(はず)。改行は省略。

 F(1)=0 F(2)=1 F(3)=7 F(4)=2 F(5)=5 F(6)=8 F(8)=3 F(10)=6

  

よって、210行の PRINT文が実行される回数は8 ・・・サの答

  

後で実際にプログラミングしてみる予定。とりあえず今日のところはこの辺で。。☆彡

  

  

P.S. 翌朝、2つとも自分で書いて、実行。この問題の説明通りに表示された。

   

210910h

  

210910i

    

      (計 2512字)

| | | コメント (0)

大学入学共通テスト2025年「情報」サンプル問題・第2問の解説~比例代表制選挙の当選者決定プログラム

朝日新聞の21年3月25日・朝刊に、令和7年度(2025年)大学入学共通テスト新科目の解説やサンプル問題例などが載ってた。

   

全体が長過ぎるので、とりあえず「情報」(必修科目・情報Ⅰの範囲)の問題だけ読むと、適度な難しさと量で第2問(抜粋)だけだったし、身近な選挙の話だから、ブログ記事を書くことを決定。

  

ところが、大学入試センターでも確認すると、朝日には無かった第2問の後半が載ってて難しく感じてしまった。私は情報Ⅰの科目内容を知らないから当たり前かも知れないが、これを数十万人の受験生(大部分は高校3年生)が短い時間で解答できるのか?

     

数年前の新テストのサンプルでもあったことだけど、本物の試験までにはレベルが下げられるだろうし、説明ももう少し丁寧になると思う。とにかく問題と解き方を見てみよう。単なる紹介や解説だけでなく、個人的な感想・意見も加える。問題文は長過ぎるので、コピペさせて頂いた。

    

  

     ☆     ☆     ☆

210331a-t

  

210331b-t

    

   

比例代表式選挙の獲得議席は、得票数に正確に比例させることは(ほとんど)出来ない。ごく簡単な例だと、議席数1の選挙区で、A党が3票、B党が2票だった時、正確に比例させると、0.6議席と0.4議席になってしまう。

  

実際の選挙だと、議席数は0以上の整数でなければならないので、正確な比例ではなく、大まかな比例を目指す方式が必要になる。日本では基本的にドント方式。私は昔、簡単な説明を読んだ気がするけど、完全に忘れてた。

  

問題の「基準得票数」とは、1議席が何票分かというより、何票で1議席とれるかと考えた方が分かりやすいと思う。合計3480票で6議席だから、580票で1議席とれる。この580が、下のプログラムでは kizyunsuu (基準数)と書かれてる。

      

配列 Tomei [i] は、i番目の党名の列。それぞれの要素は、例えば Tomei [0] ならA党。Tomei [1] ならB党。

  

配列 Tokuhyo [i] は、i番目の得票数の列。例えば Tokuhyo [2] なら、2番目のC党の得票数。ここでは、1440。

     

    

     ☆     ☆     ☆

210331c

   

sousuu という変数は、「得票数の総数」を表す。上のプログラムだと、(03)(05)(06)に従って、初期値0に4つの党の得票数を1つずつ足して行くことで求めてる。

  

1本の数式にまとめると、最終的に4つとも足し終えた後では、

sousuu=0+1200+660+1440+180=3480

    

giseki (議席)は選挙区ごとに決まった定数で、ここでは。他の選挙区では他の数値をとり得る。

  

よって、 kizyunsuu (基準数)= sousuu / giseki = 3480/6=580

  

後は、各党ごとに表示して行けば、下の枠内のようにモニター表示される。

  

  

     ☆     ☆     ☆   

210331d-t

    

  

単純な比例配分だと、それぞれの獲得議席数は無限小数になる可能性が高いし、小数点以下の切り上げ、四捨五入、切り捨て、いずれも(あまり)上手く行かない。そこで、先生が登場。

   

     

210331e-t

   

210331f-t

    

  

配列 Hikaku [i] は、獲得議席を1つずつ決める時に比較する数字の列。最初はどのi(つまり、どの党)でも、得票数そのものだが、1議席とると2で割り、2議席とると3で割る。どんどん小さくなるので、他の党にも議席獲得のチャンスが広がる。

  

配列 Tosen [i] は、i番目の党の当選数(=獲得議席数)。4党の合計が6になるまで、1回の比較ごとに、どれかが1ずつ増えていく。例えば、今回の比較ではD党が最大だから、D党の Tosen [3] が1増えるとか。

   

    

     ☆     ☆     ☆

210331g-t

   

210331h-a-t

    

  

最初、 Tosen (当選数)が0,0,0,0の状態からスタート。1回目の比較では、Hikaku [2] (つまりC党の数)が最大。よって、maxi(最大値を与えるi、つまり党番号)は2。よって、C党の当選数を表すTosen [2] が1増えて、Tosen には0,0,1,0と並ぶ。

   

2回目の比較では、C党だけ2で割った票数になって、Hikaku は1200,660,720,180と並ぶ。Hikaku [0] (つまりA党の数)が最大だから、maxiは0。よって、A党の当選数を表す Tosen [0] が1増えて、Tosen には1,0,1,0と並ぶ。以下、同様。

  

朝日新聞はこの問2までしか掲載してなかった。次の問3が私には難しくて、解きにくかったのだ。

     

   

     ☆     ☆     ☆

210331i-t

   

210331j-a-t

  

  

tosenkei は、その時点での当選者の合計。初期値0からスタートして、1ずつ増えて、議席数6に到達したら終了。つまり、tosenkei がgiseki (議席)6より小さい間は、比較して当選者を決めていく操作が繰り返される。

   

私はここまではすぐ理解できたけど、プログラムの(09)~(13)がなかなか分からなかった。「max」という新たな変数と、前に出て来てた「maxi」との違いがピンと来なかったし、そもそも何を繰り返し行ってるのかも分からない。

  

しばらく考えて、各回ごとに比較する4つの数字の中で最大の数値(max)を少しずつ探す作業だと分かった。まず、maxの初期値0からスタート。0< Hikaku [0] (つまり0<1200) だから、max=Hikaku [0]=1200。maxi は0(A党の党番号)。

  

次に、1200< Hikaku [1](つまり1200<660)ではないから、max も maxi も変化せず。さらに、1200< Hikaku [2] (つまり1200<1440)だから、max = Hikaku [2]=1440。maxi は2に変化。最後は、maxi は2のまま。

  

だから、プログラム(14)によって、Tosen [maxi](つまり Tosen [2]) は1増える。tosenkei(当選者数の合計)も1増加。

   

そして、Hikaku [maki] (つまり Hikaku [2])は、Tokuhyo [maxi] / (Tosen [maxi] +1)へと減少。つまり、Tokuhyo [2] / (Tosen [2] +1)へと減少。要するに、1人当選したC党の票数を1+1(つまり2)で割ってる。小数点以下は「切り捨て」関数で捨てる。

   

   

210331k-t

  

210331l-a-t

     

210331mthumb

   

  

最後は、各党の候補者数が足りなくなった場合への細かい配慮で一通りの完成。各回の比較で、最大値を探す時、候補者数が足りてる党の数値だけをチェックする。

  

普通に考えるなら、 (その党の候補者数)>(その時点のその党の当選者数) 。

不等号の使い方を少し変えると、 (その党の候補者数)≧(その時点のその党の当選者数)+1

  

候補者数の配列 Koho を追加で導入して、

 Koho [i] >= Tosen [i] +1

  

上の式をプログラムの(11)行に「and」で付加すればよい。最後の設問の選択肢では、≧ と< を混ぜてるから、受験生は迷ったり間違えたりする可能性が高い。まあ、最後を難しくするのはありがちな問題作成だし、OKだろう。

  

  

     ☆     ☆     ☆

これで、残る問題点は、そもそも議席数に対して立候補者数の合計が足りない時だけだろうか? 他にも何か細かいバグ(欠陥)がこのプログラムに含まれてるのかも。

    

この問題を自分で考えてる時、すぐに、比較する数値が同じになったら番号が小さい党が有利で不公平だと思ったけど、問題の一番最後にちゃんと説明してあった。

   

プログラムとの関連は分からないけど、選挙の最後にくじ引きの抽選を行ったというニュースは見覚えがある。そもそも選挙などやらずに、単なるくじ引きでいいという政治思想もあるくらいだから、許容範囲だろう。

  

運も実力の内。天の声、天命。というわけで、今日の天命(テンメイ)のブログ記事は終了♪ ではまた。。☆彡

   

      (計 3090字)

| | | コメント (0)

より以前の記事一覧