鶴亀杯~note俳句大会夏の陣に参加したついでに鶴亀算攻略プログラムを作ったよ
恒例となっているnote俳句大会。今回は鶴亀杯なのですって。夏をテーマにした俳句、今回も詠ませていただきます!
鶴亀杯要項
締め切りは7/25の24時迄。
夏っぽい句(季語なし、季重なりもOK)とのこと。
さらに短歌や川柳の大会も同タイトルにて併設されているようです。
これから参加してみようかなという方はどうか締め切りまでにっ!!
ではさっそくまいります。
投句
以上、読んで伝わらなければ意味ないので、今回も基本的に解釈の説明はいたしません。
(▼…と言いつつ、俳句に関連したAmazonリンクを貼ったりして)
鶴亀算とは
ここからは俳句と関係ない話をします。まぁ今回のタイトルにちなんだ話ということでひとつ。
数学(算数)の問題形式の中に「鶴亀算」というのがあります。
この問題はよく中学入試に出てくる(らしい)もので、中学生以降なら連立方程式にて解くのが通常とされているのですが、小学生は未だ方程式を習っていないことが前提であるため、受験などに際してはそのセオリーに即した方法で解くということになっているようです。
とはいえ算数も数学もガチの苦手で何度も留年寸前まで追い詰められたほど理系ダメ人間の私としては、そんなもんにまともに向き合うことはできず。ということで、思い付きと勢いで作ってしまいました!
鶴亀算瞬殺プログラム
IchigoJam-BASIC版
10 A=0
20 INPUT"ゼンブ デ イクツ?",X
30 INPUT"アシ ノ ゴウケイ ハ?",Z
40 B=X-A
50 IF Z=(A*2)+(B*4) THEN GOTO 80
60 A=A+1
70 GOTO 40
80 PRINT"ツル ノ カズ",A
90 PRINT"カメ ノ カズ",B
Python版
a=-1
b=0
x=int(input('全部で何体?:'))
z=int(input('足の合計は?:'))
while z!=(a2)+(b4):
a=a+1
b=x-a
print("鶴の数",a)
print("亀の数",b)
ではプログラムの解説をさせていただきますね。
変数はどちらも共通で次のようになっています。
鶴亀算では全体個数と足の合計が先に分かっているので、まずこれをIUPUT文でインプットさせます。BASICもPythonもINPUT。分かりやすいっすね。
で、このプログラムではまず鶴の数を「0」として始めるのです。
BASICではA=0、Pythonは構成の関係から後で+1するためA=-1としています(BASICをPython側に合わせても良かったのですが、面倒なのでそのままにしました。むしろBASICの方が素直で良いコードだと思っているし)。
鶴の数が決まっていれば、亀の数は全体個数から鶴の数を引いた値です。
これが、B=X-A で表される計算式です。
こうしてとりあえずの鶴と亀の数が決まったら、その足の数を合計してみるのです。鶴は2本足、亀は4本足ですよね。それぞれの数量を掛け算し、両者を合計します。
これが、(A*2)+(B*4)という部分です。
BASICとPythonでは文法が違いますが、何となくは分かるでしょうか。
そして出た値を最初に入力した足の合計(Z)と比較してみるのです。
Zと(A*2)+(B*4)が違っていたら、最初に決めた鶴の数が間違っていたことになるので、鶴の数を+1します(A=A+1)。
そして、同じ処理を繰り返します。
するとどこかで、最初に入力した足の合計(Z)と鶴&亀の足の数の総和が同じ(=)になるときが来ます。
そうしたらそこで鶴の数を加算することを止め、その時点での鶴と亀の数を表示してプログラムは終了というわけです。お疲れ様でした~!!
このような問題の解き方を「総当たり」と言います
「総当たり」という言葉はあまり聞き慣れない方もおられるかも知れませんが、パスワードや暗号などを解読する際にこの類の手法が用いられたりします。すなわち「0000」から「9999」までの可能性がある組み合わせを片っ端から試していくという手法。よく「総当たり攻撃」(ブルートフォースアタック)なんて言ったりすることもありますよね。
今回の場合であれば鶴の数を0羽からスタートして、ダメであれば1羽、それでもダメなら2羽、またダメなら3羽…というように、等式が成り立つまで愚直に鶴の数を増やして計算して…を繰り返すというものです。人間がやるとしんどいですが、だからこそコンピュータの出番なわけ。プログラミングのおかげでまったく数学のできない私が鶴亀算を瞬殺できてしまうのだから、コンピュータ様々ですよホントに。
なおこのプログラムは整数で成り立つ解が存在しない問題をぶつけると一切回答が帰ってこなかったり、どちらかの個体数が負の数になったりします。本当はそのあたりのチェッカーも込みで作るべきなのでしょうが、なにせ残業祭りの会社員が帰宅後に酔っ払いながら作ったプログラムなので、細かいことにはどうか目をつぶっていただければ幸いです。
つまるところなにが言いたいのかというと、
今回もギリギリ参加になってしまいごめんなさいっ!
(以下言い訳)いや、俳句の方は2週間前とかに既に出来上がっていたのですよ。ホントにっ!!まぁ推敲のため(と称して)デスクトップの上に放置されていたりしましたけれども。
それよりか、「noteに俳句だけ書いてあるんじゃ寂しかろうよ、なんかしら面白いこと書いとかな」とか思ってウダウダ過ごしていたことの方がよほど時間を浪費した原因としては大きかった気がします(反省)。
かくして出来上がった夏の俳句とプログラミング。第三者的に面白いコンテンツになったかどうかは分かりませんが、気付いてみれば俳句よりそれ以外の文章の方の方が長くなってしまいました。つきましてはここらで駄文を締めさせていただきます。つるかめつるかめ。
〈当日追記〉
本記事をアップしたところ、いつも当方noteにて大変お世話になっている上田市マルチメディア情報センターの斎藤史郎先生から方程式方式によるプログラムを提供いただきましたので合わせて掲載いたします。
10 INPUT "ゼンブ デ ナンビキ?",A
20INPUT "アシ ノ ゴウケイ ハ?",B
30 Y=(B-2*A)/2
40 X=A-Y
50 PRINT "ツル ノ カズ=",X
60 PRINT "カメ ノ カズ=",Y
▲の記事もよろしければどうぞ。