intime o'

あの立派な知識はことごとく昨日の夢である!(ラ・メトリ著「人間機械論」より)
数学雀 2012/08/26(Sun.)
数学雀(マスジャン)を試しに出来る所までプログラミングで実装
してみようと思ったのだけれど、これは数の暴力でまるでできそうに
ない.手元に本が無いので朧気な記憶だが、14牌で役を作るんだよね、
たしか、普通の麻雀と同じように.

具体的に実装というのは、牌の配列があって、それが和了となっているか
の判定の部分で、実際そこが一番重要だろうから.全然むりだった.

4つの数字と四則演算(あと任意コのカッコ)だけで10だか何だかを作る
のは小町算だったか、高校生の時にそれを解かせるプログラムを書いて、
もしかしたらそれが初めての乱択だったかもしれない.
真面目に全探索するのがすごく面倒に思われて、いわゆるpermutationを
自力で実装するのは、ググればごろごろ出てくるけれど.
とにかくその時はランダムにやって、下手な鉄砲を一発でも当てれば
いいものとするやり方で、それでも結構時間がかかったなぁ.

全通りは、
4つの数から2つを選んで、4つある演算の内1つを使って、1つの数字に
変換する、それを加えて3つの数から2つを選んで...って考えたら
1152通り.全然大したことないじゃないか…
同じ数を含んでいるとして、重複を上手く取り除くようにすれば
もっと少ない.

書け、と言われたら書けるだろうか


数学雀に出てくるのは
一桁の数字(9コ)、二項演算子として四則、べき乗、一項演算子として
根号、階乗

自分でルールを確認できないので
http://nonbiriyaruyo.cocolog-nifty.com/blog/2012/08/post-5502.html
を信用してる.
数字はdigitであり、並べて二桁以上の数としてよい.これがまず
小町算と全く別物とする.

そもそも数式として成り立たない場合は、二項演算子の両側に
数が並んでいない場合だろう.一項演算子はひとつの数をひとつの数
に写すだけなので、どうとでも使えるが、二項演算子は必ずふたつの
数を受け取って一つしか返さない.つまり、全体として使える数が
一つ減る.そして最終的に一つの数を数式は返す.

だからつまり、
数(すう)の数(かず)は、二項演算子の数より1だけ多い.
これが数式として少なくとも成り立たせられる条件.

もちろん数がゼロ個しかない場合も不成立であるが、これは
上の条件に含まれているのでどうでもいい.

和了の状態では牌は14コ.
この内、数牌、一項(演算子)牌、二項牌の含まれる割合はどうなるか.
巡を重ねてくごとに恣意的になるが、どうせ毎順チェックするとするなら
全て同様に確からしいとすれば、

14牌の内、数牌は 7.9 枚、一項牌は 1.75 枚、二項牌は 4.4 枚.

とかこんなもの.
数牌は組み合わせて 5.4 つ程度の数にしたてる必要がある.
大体何通りだろうか.
同じ数を含む場合は、含まない場合よりも少ないが、概算として、
「同じ数を含まない8枚を5枚にする」を考えてみる.

実際は含まない場合よりも少ない、ということで5.4を5と少なくした.

やはり、「nコの数から2つを選んで、順序を考えてくっつけて1コの
数に変換する」を考えると
8P2 * 7P2 * 6P2 = 70560通り.

ほらもう、あんまりよろしくない.
すくなくともスクリプト言語で書くレベルではない.

二項演算子の数よりも1だけ多い数を作ったとして、
数牌は 5.4 枚、一項牌は 1.75 枚、二項牌は 4.4 枚.

あとは自由な順で演算子を使えばよい.
一項演算子は数の数を変えないので、二項演算子が
毎回選ぶ2つの数の選び方は、全体としては変わらない.
一項演算子だけは使うタイミングで数の選び方が
変わる.ふしぎだ.

もう面倒だから少なく見積もって
数牌は 5 枚、一項牌は 1 枚、二項牌は 4 枚.
とする.
そうすると何通りであるかは、(「何通りであるか」に対する
数学用語って無いよなぁ、あるのかな.「場合の数」くらい
の言葉しか見たこと無いけど)割りとキレイな式で与えられて

(5 + 4 + .. + 1) * (5C2 * 4C2 * .. * 2C1) * 4! = 60480 通り

最後の(4!)を掛け忘れてて、案外大したこと無いとか思ったけど
全然そんなことなかった.

さっきの 70560通り と掛け算して
4267,512,000 通り.

これは良くない.
さっきから暗算でできない計算はvimの計算機能を使って
やってたんだけど、(編集モードで<C-r>=ってやるやつ)
最後の計算はオーバーフローするレベル.

気づいてしまったけど、作者は案外何も考えてないんだなあ

コメ(0) | トラ(0)