■数学基礎:板チョコ割りゲーム

これも、秋山仁センセの「高校講座 数学基礎」の「数理ゲーム必勝法」で紹介されていたゲームをそのままFlashで作ったもの。交互にチョコレートを縦横の溝に沿ってパキと折っていき、右下のホワイトチョコレートを相手に取らせたら勝ち。

遊び方:最初に先手、後手を選んだあとは、キーボードの方向キー(上下左右)でチョコレートの折る場所を決め、スペースキーを押して折る(※日本語入力をOFFにしておかないと反応しません;;)。

一度、遊んでみれば、必勝法はすぐわかるので、書くまでもないが、秋山仁センセの授業では、ゲームの最終的な形(茶と白の山がふたつの状態)から、遡って必勝法を見つける、逆思考法を説いていた。すると、先手の場合、相手がどのように取っても、自分は正方形になるように取っていけばいいんだな、ということがわかる。

「数学落ちこぼれ」のひきもり爺の時間の潰し方として、FlashのScriptを書き、試行錯誤を繰り返しながら、それがうまく動いたときは楽しいのだが、必勝法がわかっている数理ゲームをFlashで作ることに、はたして意味があるのかどうかは疑問が残る……。やりたいこと、学びたいことはたくさんある。「少年老い易く学なり難し」と言うが、酔っ払い爺には、さらに時間が足りない。覚えたこともすぐ忘れちゃうし><;

■数学基礎:フィボナッチ寿司

石取りゲーム(ニム)の第2弾「フィボナッチ寿司」。パーツは使いまわしだけれど、ルールが違うので必勝法も違うからね。Wikipediaの分類によると「二人零和有限確定完全情報ゲーム」ということになる。


ルール
1:最初の一手のみ、寿司は何個でも取れる(ただし、全部を取ることはできない)。
2:二手目からは、相手の取った寿司の数の2倍まで取ることができる。
3:交互に寿司を取り、最後に寿司を取ったほうが勝ち(パスはできない)。

前に「蓼食うバグも寿司好きゲーム」を作ったが、必勝法を発見するというより、先手なら、どんな手を打っても勝ててしまう(しかもバグあり)。数理ゲームにしても、もう少し楽しめるものを作りたいなぁ、というのが今度の「フィボナッチ寿司」なんだけど、必勝法をコンピュータに覚えさせるのに苦労するばかりで、完成しても自分では楽しめない;;

とりあえず、必勝法と解説は後日……^^;

2月17日追記:必勝法はこちら

“■数学基礎:フィボナッチ寿司” の続きを読む

■コマネチ大学数学科37講:断面

おめぇに喰わせる「断面」は、ねえぇ!の「たけしのコマネチ大学数学科」の第37講。

問題:小さい立方体9261個を使ってひとつの大きな立方体を作り、断面が正六角形になるように切断します。このとき、小さい立方体は何個切断されるでしょうか。

20070209_01

立方体の各辺の中央を通るように切断すると、断面が正六角形になる。上のFlashは、3×3×3の立方体だが、隙間を作っているので、わかりづらいかもしれない。各辺が5の立方体は図のようになる。中央の赤い六角形を取り囲むように六角形が増えていくが、小さな三角形は、六角形の数の2倍ずつ増えていく。

20070209_02

※注:表のF列の数値に誤りあり。nanzanさんのコメントを参照(2008年4月2日追記)

これを表にすると、正六角形の増分は「6n」、正三角形の増分は「2*6n」、そして切断される小さな立方体の増分は、これを足したものなので「3*6n」になる。9261個の小さな立方体で作った大きな立方体の辺の数は、21×21×21なので、これに当てはめ、合計を出す。

マス北野は、正三角形の数が正六角形の数の倍と考え、「331×2」としてしまったため、惜しくも正解を逃してしまった。1個の立方体を切断したときに出来るのは正六角形のみ。ううむ、中村亨センセの解説をそのまま、なぞっているだけになってしまった;; 

美しき数学の時間では、いろいろなパターンの「アルキメデスのタイル張り」を紹介していた。最近、FlashのActionScriptで図形を描くことを覚えたので、いつか挑戦してみたい。それと、今回は、Shadeで作成したアニメーションをFlashに埋め込むことに挑戦してみた。

■数学基礎:数理ゲーム必勝法

秋山仁センセのNHK高校講座「数学基礎:数理ゲーム必勝法」を参考にして、Flashのゲームを作成してみた。名づけて「蓼食うバグも寿司好きゲーム」イェーイ^^;

ルール
1:一度に取ることのできる寿司の数は最大3個まで。
2:直前に相手の取った寿司の数と同じ数の寿司は取れない。
3:先に寿司を全部取ったほうが勝ち(取る寿司がなくなったら、負け)。

問題:このゲームの必勝法を考えなさい。

遊び方
最初に「先手」「後手」ボタンを押して、ゲームをスタートする。食べたい寿司をクリックして、寿司を取り、画面右下の「赤いボタン」を押して、相手の番に渡す。もしも、「相手と同じ数の寿司は取れません!」と表示されたら、寿司を追加して取るか(ただし、3個まで)、手前の寿司(取った寿司)をクリックして寿司を戻し、「赤いボタン」をクリックする(※注意:このゲームの勝敗は、好きな寿司のネタをいくつ取るか、ではなく、寿司が取れなくなったら負けという点。誤解しないように^^;)

いわゆる「石取りゲーム」の変形なのだが、相手と同じ数の寿司を取ることができないというルールがミソだ。たとえば、最後に寿司が1個残ったとして、あなたの番のとき、この寿司を取れば勝ちだが、直前に相手の寿司を取った数が「1」のときは、その寿司を取ることができない。そのときは、「赤いボタン」でパスをしてほしい。

このゲームは、秋山仁センセの授業のとおり、数理ゲーム的には「先手、必勝」だ。ただし、「寿司食うバグ」を退治できたかどうか自信がない。数理ゲームの必勝法を考えるより、バグ取りに悩まされた。「けっこう毛だらけ、ネコ灰だらけ、私のプログラムはバグだらけ」というわけで、もしかしたら「後手」で勝つ方法があるかもしれない(><;

■コマネチ大学数学科36講:フラクタル

マス北野によると、映画「TAKESHI’S」の元タイトルは「フラクタル」だったとか「たけしのコマネチ大学数学科」第36講。

20070202_01
問題:以下の規則に従って白玉と赤玉を64段まで並べるとき、必要な赤球は何個でしょうか。
規則
1:1段目に白玉を置く
2:2段目以降、両端には白玉を置く
3:3段目以降、斜め上2個が同じ色なら赤だまを、違う色なら白玉を置く

というわけで、コマ大数学研究会にならって、ひたすら並べてみるものの……。32段目で挫折;;

20070202_02

8段目までで白玉は27個、64段では、この形が27個あり、27×27で白玉は729個。玉の総数は「n+(n+1)/2」で、64*65/2で2080個、2080-729で、赤玉の数、1351個が求められる。

20070202_03

竹内薫センセの「美しき数学」の時間では、もっと簡単に求める方法を紹介していた。すべてが白玉になる段に注目すると、1,2,4,8……段。このときの白玉の総数は、1,3,9,27……と3倍になっている。

パスカルの三角形」の奇数、偶数を塗り分けると、シェルピンスキーのギャスケットになる話は、以前のエントリーで書いた。

●マンデルブロ

Mandelblot_01

マス北野もマンデルブロやフラクタルにはまっていたことがあるそうだが、私も、十数年前、はまっていたことがある。当時は、書籍などに載っていたプログラムを参考にして、「X68000」というパソコンのBasicで描いていたのだが、描画が遅くて、その後、Visial Basicに直して描いたりしていた。「日経デジタル大事典」の記事を書いたとき図版として使用した画像は残っていたものの、プログラムは残っていない;;

Mandelblot_02

マンデルブロ図形の細部に入り込んでいくと、行けども行けども果てしなく、不思議な図形が現われる。

●Flashでシェルピンスキーのギャスケットを描いてみた。

20070202_04

手書きでは、正確な正三角形を描くのが難しいため、最初の三角形を、Action Scriptで描く。Action Scriptで描いたのは2フレームまで、あとは、これを断片のひとつとして、シンボル化し、手作業で貼り付けた(^^;

■Google入社問題

 先日、NHKスペシャル「Google革命の衝撃」が放送された。その中で、Googleの人材募集の広告が紹介されていた。人材募集なのに「Google」の文字は、どこにもなく、「{eの値で、最初に出てくる10桁の素数}.com」とあるだけの広告だ。

 ネットで調べてみると、これは、数年前の出来事らしい。そういえば、そんなことがあったかも知れないと、かすかに記憶が甦ってきたが、たぶん、当時は「へえぇ」という感じでスルーしていたのだろう。

 で、「コマネチ大学数学科」が始まるまでの間、この問題をあらためて考えてみた。自然対数の底「e」の値といったら「ネイピア数」だ。

■たけしの誰でもピカソ:ネイピア数e相性診断
 2億桁のネイピア数の中から、ふたりの誕生日が何桁目に登場するかを調べてくれる。しかし、自分の誕生日4桁と相手の誕生日4桁で、8桁にしかならない。しかも、月は12、日は31までと、入力できない数が多すぎる。これでは役に立たない;;

 しょうがないので、「エクセル」で作ろうと思ったが、エクセルのMOD関数は、10桁の数値には対応していない;; VBAを使えば、なんとかなりそうな気がするが、なんか面倒なことになりそうで気後れする。手軽に出来るのは、FlashのActionScriptだ。ネイピア数は、ひとまず置いといて、問題を簡単にするため、適当な文字列「222215722222」の先頭から順に3文字ずつ抜き取って、それが素数であるかどうかをチェックする、FlashのAction Scriptを書いてみる。

20070125_01

20070125_02

 動作チェックをすると、確かに「222215722222」の文字列から「157」を抜き出し、それが「素数」であることを判断している。白状すると、素数かどうかのチェックは「Wikipedia」の「素数判定」の項目から、引用させてもらった。

 ここまでくれば、あとは簡単。最初の文字列に「自然対数の底e」の値(ネイピア数)を入れ、抜き出す文字列の数を「10」にするだけだ。

自然対数の底「e」の値は、以下のサイトでも入手可能……。

■eの値
 しかし、500億桁もいらないんですけど^^; 最初の1億桁だけでも、55MBもある。解凍すると、117MBのテキストファイル;;「エクセル」では、全部を読み込めなかった。

■自然対数の底
 こちらは、指定した桁数の「自然対数の底」の値を表示することができるので、便利だ。とりあえず、250桁を表示してコピーし、それを、FlashのActionScriptに貼り付ける。

20070125_03

20070125_04

 「なぬ~っ!」動作チェックでは、うまく動いてくれたのに、「False」だとぉ~;; あれこれ悩んでみたが、うまい解決策が思いつかない。たぶん、どこかでオーバーフローしているのだろう。いつも「結果が出ればいいや」と、コマ大数学研究会ばりの体当たりプログラミングをしているから、こういうことになる。やはり、基礎ができてないと、こういうところでボロが出る。付け焼刃の数学の知識ではダメらしい。「アホなことやっているなぁ」と思った方は、迷える酔っ払いの爺に愛の手を!

(1月26日追記:ループ数が10のままだぁ^^;;)

(1月27日追記:偶数を除外していなかった;;やっと正解に!)

 数年前の問題なので、ネットで調べれば、正解はわかる。正解は「7427466391」。

2.718281828459045235360287471352662497757247093699959

5749669676277240766303535475945713821785251664274274

6639193200305992181741359662904357290033429526059563

0738132328627943490763233829880753195251019011573834

 で「7427466391.com」へアクセスすると、次の問題が提示される。
《以下、引用》
Congratulations. You’ve made it to level 2.
Go to www.Linux.org and enter Bobsyouruncle as the login
and the answer to this equation as the password.

f(1)= 7182818284
f(2)= 8182845904
f(3)= 8747135266
f(4)= 7427466391
f(5)= __________

《引用終わり》
 こちらの問題は、f(1)~f(4)の数値が10桁で、すべての数値を足すと「49」になることに気が付けば、さほど、難しくはない。これなら「エクセル」でも、解けるぞ。

20070125_05

セルA1に、先ほどの「自然数の底」サイトからコピーした数値を貼り付ける(セルの書式設定は文字列にしておく)。MID関数を使って、1文字ずつ、移動させながら10文字分を抜き出す。オートフィルの連続入力をするため、行番号を求める、ROW関数を使って、抜き出す文字列の開始位置を求めている。さらに、抜き出した文字列を1文字ずつ分解して数値に換え、「=VALUE(MID(A3,$B$2,1))」その合計を出す。合計が「49」になる行を見ると、f(1)~f(4)の値になることを確認できる。

20070125_06

5番目の数値は、129行目に出現する。ネイピア数の小数点以下、127桁目だ。

 結局、「コマネチ大学数学科」が始まるまでの小手調べのつもりだったが、番組が始まっても、こちらの問題に気をとられたまま、酔いが限界に達している。なんとしても、この記事をアップしてから、眠りにつこう。今回の「コマネチ大学数学科」の問題は、かなり難しいという印象……。

今回、参考にした素数についてのサイト

■a prime number
 1から2147483647までの素数を計算する。残念;;10桁だが、「9999999999」まで表示できないと、今回の問題には対応できない;;

■ゆいのホームページ:ソフトウェア&小技メモ
 341,550,071,728,321以下の素数(15桁)を、1個当り数秒で求める。短時間で素数を判定するアルゴリズムのキーワードは「2,7,61」? このサイトを利用すれば、10桁の素数表を作成することができるが、素数表とネイピア数とのマッチングを試みる方法は、いささか、現実的でないような気がする。

■AjaxによるRSAアルゴリズム体験
 360桁の素数でも一瞬で表示する。なんで、こんなに速く素数を生成できるの? 素数生成のアルゴリズムは、いくつかあって、それが素数であるかどうかを検証することのほうが難しいのか……。いわゆる、因数分解するほうが大変という「N≠NP」問題なのかな?

■コマネチ大学数学科33講:中国人郵便配達問題

シャブリの気になったもの:コマネチ大学#33

酔いつぶれて録画予約を失敗してしまった「コマネチ大学数学科」だが、上記のブログに問題と、非常に丁寧な解説が載っていた。詳細は上記ブログを参照してもらうとして、酔っ払い爺としては、実践あるのみ。ホントにそうなのかを検証してみよう。

「スタート」ボタンを押してから、キーボードの方向キーで郵便配達夫を操作してほしい。

問題は「郵便局から出発して、すべての家に郵便物を配達し、再び、郵便局に戻る、この間の移動距離が最小となるような経路を見つけよ!というもの。小さいひとマスの辺を「1」としたとき、最短経路の移動距離を求めることになる。

で、経路を最短にするには、できるだけ、同じ道を通らないこと。一筆書きができれば(無駄な移動を省くという意味で)それに越したことはないのだが、どうやら、この図形は一筆書きができない。ならば、どうすればよいのか、というのが、この問題のポイントだ。

重複して通る経路をどこにするか。「ケーニヒスベルクの橋」問題で、オイラーは、一筆書きができる必要十分条件として、「すべての頂点の次数が偶数」または「次数が奇数の頂点の数が2で、残りの頂点の次数はすべて偶数」のいずれかとした。つまり、奇数点を偶数にすれば、いいんだよね。そう考えると、自ずとバイパスを設置するポイントが見えてくる。

そんなわけで、パターンを知ってしまうと、意外と簡単な問題。このバイパスを設置する(二度通る経路を決める)と、スタート地点がどこにあろうが、最短距離ですべての家に郵便物を配達できる。この問題の答え(1マスの辺を1とすると)、最短距離「28」で、すべての家に郵便物を届け、出発点の郵便局に戻ってほしい。

■小飼弾さんの回答篇

404 Blog Not Found:
コマネチ大学数学科第一回M-1グランプリ回答篇

●FINAL ROUNDの問題

1000本の棒を使って正四面体を作り、積んでいくと、何段になるでしょう?

小飼弾さんの回答は、正四面体165個(990本の棒)を積み上げると、正四面体1個と4本の棒が残る。この最後の1個を頂上に乗せて10段としてしまうというもの。コマ大数学研究会が使っていた、ロウを溶かして、固めて接着する工具(?)を使えば、なんとかなりそうだ。

M1_dan_01
さらに、正四面体の底面の部分を貼りあわせた形を作る。底面の3本の棒を共有した正三角形の六面体で、棒の数は9本。これを縦に積み上げる。正三角形の六面体111個(999本の棒)×2段で222段。この形を縦に積み上げるのは、超強力な接着剤を使っても難しいと思うが、やってやれないことはない。

なぜ、このような解答が可能かというと、問題では、積み方を限定していないから。問題に一言、文を追加して、次のようにすれば、よかったのではないかと思う。

1000本の棒を使って正四面体を作り、これをピラミッドの形になるように積んでいくと、何段になるでしょう?

これなら、1枚のフリップに収まると思うのだが……。でも、ピラミッドを中抜きする方法があるのか><;

弾さんの回答篇は、私のエントリを待っていてくれた節がある(私が勝手にそう思っているだけ^^;)。弾さんは、とっくに回答篇を用意していたはず。Shadeの図版作りに梃子摺り、記事を公開したのは、朝方の時間にもかかわらず、その10分後には、「おいおい、いつまで待たせるんだよ!」とばかりに回答篇が公開された。しかも、私のブログへリンクまで貼っていただいていた。そんな心優しき弾さんへの感謝を込めて、ROUND2の図形問題、マス北野の解答篇を載せておく。

■コマネチ大学数学科マス1グランプリ

 昨年末の「M-1グランプリ」は「チュートリアル」が獲ったけれど、もう一つの「M-1」、「マス1グランプリ」は誰の手にと楽しみにしていた「コマネチ大学数学科マス1グランプリ」。期待に違わず、かなり楽しめた。しかし、「いいちこ」漬けの頭では、リアルタイムに参戦できるわけもなく、録画した番組であらためて問題を振りかえってみた。

●ROUND1 計算問題

M1_round1_01

計算すれば答えは出るのだけれど、いかに式を簡単にするのかがポイント。私がパッと答えることができたのは、問9だけだった;;

●ROUND2 最速図形バトル

計算問題で出遅れたマス北野だったが、さすがに図形問題では最速。しかも、上のFlashで紹介している解法は、ハサミを4回入れなければならないが、マス北野は、たった2回ハサミを入れるだけで、正解した。じつは、2番目に速かったのは、西本さん。しかし、思考速度は速いものの、不器用ぶりを発揮し、図形を並び替えることに手間どり、東大生チームに先を越されてしまった。ツッコミどころも満載の西本さんであった。

●FINAL ROUND 一騎打ちバトルロイヤル
マス北野と数学オリンピックの2年連続チャンピオン、西本さんとの一騎打ちとなった。
M1_round3_01_1

問題は「1000本の棒を使って正四面体を作り、積んでいくと、何段になるでしょう?」というもの。ひとつの正四面体を作るには、6本の棒が必要。これを1000本以内で、図のように積み上げていくと、何段作ることができるかということ。

M1_round3_02

1段目は正四面体が1個。2段目は3個。3段目は6個……と続く。関係ないが、「Shade」で正四面体を描くことが、こんなに大変だとは思わなかった。で、1つの正四面体を描いたなら、あとは、コピーして貼り付けるだけなのだが、これも、意外とめんどうくさい。2段目で挫折……。それを考えると、コマ大数学研究会のがんばりは、スゴイ!と思う。

M1_round3_03

というわけで、エクセルで表にしてみた。段ごとの正四面体の数は、1段目からその段までの数を足したものになる。セルB4に「=SUM($A$3:A4)」として、オートフィルで以下の行を連続入力する。合計の欄も同じく、セルC4に「=SUM($B$3:B4)」とする。この合計に6を掛ければ、棒の数が出る。9段目で990本になり、10段目では1000本を超えてしまう。

これは、マス北野の方法と同じだ。西本さんは、最速ですぐにこの問題を解く公式を導き出した。ただ、番組では説明の部分がカットされていたのが残念だ。

美しき数学の時間では、竹内薫センセが解説。この問題、パスカルの三角形を用いても解くことが可能とのこと。

M1_round3_04

正四面体の合計数が表れているではないか。しかも上から数えてみると、9段目が「165」になる。まるで、手品で「引いたカードをあらかじめ予言しておきました」みたいな、パスカルの三角形。パスカル、あんたはスゴイ! ふと、今、思いついたのだけれど「同じ大きさの鏡餅を3つ並べて、その上に1個置く。このような形で10段の鏡餅を作るには、鏡餅は何個必要ですか?」という、お正月らしい問題ならば、コマ大数学研究会は、これほど苦労しなかったはず……あ、これじゃ、番組として成り立たないのか^^;
でも、段ごとに必要な正四面体の数を考えるとき、鏡餅で考えると、わかりやすいかもよ。