『プログラミング的思考法が身につけば、プログラムは組める・2応用編』、10,000円きっかりで切手を買いたい!
最初に免責事項を書いておきましょう。
私はプログラマーではないし、専門家でもないので、すでにプログラミングができる人には本稿の内容は役に立ちません。ブラウザバックを推奨します。
ただし、これからプログラミングを初めてみようという方、『プログラミング的思考とはなにか』、『プログラミング的思考が身につくと何ができるのか』を知りたい方は、当エッセイの内容は役に立つはずです。
このエッセイは一番簡単な『プログラム的思考』の解説を目指して、書かれています。
まず、『プラグラムとはなにか』から説明しましょうか。
プログラムは、コンピューターに命令を下す文のことです。
プログラミング言語には様々なものがありますが、どの言語も最終的に1と0からなる『マシン語』に変換されて実行されます。
プログラミング言語は多種多様で、それぞれに得手不得手があります。
教育現場向けのスクラッチ、広く普及しているJava、高速なC、様々なライブラリが充実しているPython、統計計算に強いRなどなど。
どれを学んだらいいのか? と思われるかもしれませんが、どれを学ぶのがベストというものでもなく、適切な言語を適切な場面で使い分けるべきものなのです。
言語の選択によって、プログラムを組むのに数倍時間がかかったり、実行に数十倍時間がかかったりしますから。
今日では、言語の仕様や文法なんかはちょっとググれば出てきます。そうであるならば、プログラミング的思考が身につけば、効率非効率の差はあれど、さほど苦労することなくプログラミング言語を身につけることができるといえるでしょう。
私は普段はPythonを使っていますが、本稿は以前書いたエッセイの続編であるので、引き続きJuliaを使おうと思います。
Juliaという言語は、MITが開発した新しい言語であり、『Cと比較可能なぐらい高速でPythonと比較可能なぐらい平易な文法』の言語です。
Juliaでは、(2× a + 3 × b)を、(2a + 3b)のように×(かける)を省略して書くことができます。計算をするときはかなり便利ですよね。
Julia(The Julia Languageで検索)をインストールすれば本稿のプログラムは、即コピペ+エンターで実行できるので、興味のある方はお試しください。本稿で取り上げるのは、ちょっとした計算ですが、その気があればAIプログラムだって組むことができますよ。
さて問題。
スーパーの商品棚からカップ麺が消えてしまうような状況を想定してみましょう。
ポケットの中には1,000円札があります。
1,000円札を握りしめて99円のどんぺえと144円のぺゆんぐを、できるだけいっぱい買いたいとします。余らせるのは癪なので900円から1,000円までのお金で、目一杯カップ麺を買うものとしましょうか?
この場合、どんぺえとぺゆんぐを何個づつ買う組み合わせが考えられますか?
じゃあ、計算してみましょう。
まずはじめに、人間とコンピューターの違いを理解する必要があります。
人間(私)は、総当たりで1000回計算するなんてことはやっていられませんが、コンピューターは楽勝でそれをします。実際、一瞬(マイクロ秒)でできます。
目の前のパソコンは、せっかく私達人間より良い脳(CPU)を持っているのだから、構うことなく酷使してやりましょう。
要領は、前回のエッセイで取り上げたプログラム的思考と同じです。for(繰り返し文)で総当りしてif(条件文)で該当条件を抽出するだけです。
Juliaは変数に日本語も使えるので、今回は日本語でやってみましょうか?
安い方のどんぺえでも11個買うと1,000円をオーバーしそうですね。
実際計算するときは11個まで計算すれば十分なんですが、そんなことは構いません。1,000回計算したって、マイクロ秒でやってくれるでしょう。
今回は片方が0個のケースも考えるので、0~1000個までの間計算するものとしましょうか。
さて、プログラミング的思考をしてみます。
まず、どんぺえが99円。ぺゆんぐが144円するものとします。
どんぺえが0~1000個の間と、ぺゆんぐが0~1000個の間で、99円のどんぺえ+144円のぺゆんぐの合計を計算し、もし、合計が900円から1,000円の間なら、どんぺえの個数とぺゆんぐの個数と合計を画面に表示する。
どんぺえが0個~1000個の間と -> for どんぺえ=0:1000,
ぺゆんぐが0個~1000個の間で -> ぺゆんぐ=0:1000
99円のどんぺえ+144円のぺゆんぐの合計を計算し、-> (合計=99どんぺえ+144ぺゆんぐ);
もし、合計が900円から1,000円の間なら、-> if 900<合計<1000
どんぺえの個数とぺゆんぐの個数と合計を画面に表示する-> println("どんぺえ",どんぺえ," 個 ","ぺゆんぐ",ぺゆんぐ," 個 ",合計,"円!") end end
『end』は句点、『;』 は読点と思ってください。
変数『どんぺえ』と変数『ぺゆんぐ』は、0~1000迄の間の整数で、順次更新されていきます。
続けて書いてみます。
Julia> for どんぺえ=0:1000,ぺゆんぐ=0:1000 (合計=99どんぺえ+144ぺゆんぐ);if 900<合計<1000 println("どんぺえ",どんぺえ," 個 ","ぺゆんぐ",ぺゆんぐ," 個 ",合計," 円!") end end
どんぺぇ1 個 ぺゆんぐ6 個 963 円!
どんぺぇ2 個 ぺゆんぐ5 個 918 円!
・
・
・
どんぺえ10 個 ぺゆんぐ0 個 990円!
とでればOK。
printlnのカッコの中で、ダブルクォーテーションで囲まれているのは文字、囲まれていないのは変数です。
この構文を少しいじれば、『きっかり一万円分、切手を何円と何円と何円の組み合わせで買いたい』なんてこともできそうですね。
やってみましょうか?
84円切手と10円切手はよく使うので50枚以上欲しい。120円切手と200円切手はたまに使うので15枚以上欲しい。2円切手はあんまり多いと煩わしいので10枚以内に抑えたい。
この条件できっかり10,000円分だけ切手を買いたいとします。この場合、どんな組み合わせが考えられるでしょうか?
Julia> for 八十四=50:100,十=50:100,百ニ十=15:100,二百=15:100,二=1:10 (合計=84八十四+10十+120百ニ十+200二百+2二);if 合計==10000 println("84円",八十四," 枚 ","10円",十," 枚 ","120円",百ニ十," 枚 ","200円",二百," 枚 ","2円",二," 枚 ") end end
結果は、
84円50 枚 10円50 枚 120円19 枚 200円15 枚 2円10枚
84円50 枚 10円51 枚 120円19 枚 200円15 枚 2円5 枚
・
・
・
84円55 枚 10円57 枚 120円15 枚 200円15 枚 2円5 枚
このように表示されます。
この、繰り返し文(for)で抽出して条件文(if)で選り分けるプログラム的思考は、実務上非常によく使います。例えばエクセルから列を引き抜いて条件に当てはまる数字を抽出するとか、仕事に使えそうじゃありませんか?
興味を持った方は、プログラミング系のエッセイ等を探してみるといいですよ。
私よりも詳しい方が無料でテクニックを公開されています。
コピペするときは『Julia> 』の後ろ(for~)をコピペしてくださいね。
この簡単なプログラム的思考から、プログラミングの可能性を感じ取っていただけたら幸いです。
このエッセイにあるプログラムは、Julia 1.4.0で動作確認しています。