60 日目(雨のち曇り)組み合わせ論と搭子と孤立牌と
0:00 ヒーリングタイムの都電荒川線の映像でいい感じに眠くなる。 それにしても、三ノ輪周辺は詳しいが、早稲田周辺は一度しか訪れていないのが残念だ。
8:10 起床。大雨のようだ。寒い。ローテーションなので洗濯機を回す。 朝飯は納豆とうどん。ワイドショーのニュースはバラバラか。
麻雀コードを書く。待ちの特定関数というか、実質的には同一色数牌限定の多門張解決関数だ。
4 牌からなるテンパイを仮定する。 同一牌がちょうど 3 つしかないときには、それを (1) 雀頭を含むとみるか、(2) 刻子であるとみるかで場合分けする。 (1) の場合は順子搭子として、(2) は単騎待ちとして待ち牌を特定する。単騎待ちは同じ牌を待つ。 順子搭子の待ちは (1.1) 両面、(1.2) 嵌張、(1.3) 辺張のいずれかだ。2 牌の表す数で場合分けする。
加齢のせいなのか、doctest が一発で通らない。
プログラミングに夢中になって洗濯物を取り出すのを忘れていた。
13:00 4 牌からなる手牌のシャンテン数とウェルカム牌を解決する関数を完成する。 これでルックアップテーブルを作成するのがいいと思われる。
とにかく外出。三省堂書店で雑誌をチェックする。ホビージャパンをじっくり読めるところに行きたいものだ。
14:05 ビッグエー墨田業平店。200 円。
- カラムーチョチップス
- キャベメンドッグ
- バナナ (4)
柳島児童遊園で休憩。横川コミュニティー会館図書室に直行。 新聞と確率本を読む。東京新聞が黄金湯(太平四丁目)をフィーチャーしてくれたのがうれしい。 私の前作ブログで頻出していた銭湯だ。リニューアルも楽しみだが、改装工事直前のあの風呂にも懐古趣味でもう一度入りたい。 サイコロを二個振る問題は麻雀とも関係が深い操作ゆえ、マスターしなくてはならない。
ハローワーク墨田に行き検索ごっこ。 求人票に出てくる専門用語でわからないものがあるので(例:PL/I と出し抜けに言われても困る) 必要に応じて Google で検索する。たいてい古臭いシステムや規格の名前なのだが。
タイトー F ステーションオリナス錦糸町店で 4 クレ遊ぶ。 今日のビートマニア ARENA モードは人とマッチメイクせず。CPU 相手でも 4 曲遊べればいい。
MJ プロ卓東風。親番で押し切れなくてラスト 2 巡目あたりでオリたのを後悔。
18:40 カスミオリナス錦糸町店。336 円。青椒肉絲&麻婆豆腐丼。
19:05 ビッグエー墨田業平店。227 円。
- シュークリーム
- ふっくらおむすび鮭
- 大きなおむすびツナマヨ
19:20 部屋に戻る。出かけるときに郵便受けに入っていたはずのチラシが減っている。 晩飯を食ってこれを書いてとっとと電話ボックスへ。
20:40 くらいに部屋に戻る。入浴。
21:00 風呂から上がって書類整理と PC を。タオルを物干し竿に干したままだった。
同一色(例:萬子)4 枚からなる手牌は 495 通りある。 それぞれについてシャンテン数と有効牌を求める準備ができた。 と思ったら AAAB タイプの手牌向聴数にバグがある。多門張でなければ単なる単騎待ちとみなすのを見落としたか。
21:55 出力。これで本番コードでは面倒な場合分け処理ではなく単なる dict の検索になる。
- テンパイが 207 通り、イーシャンテンが 288 通りある。42 : 58 くらい。
- テンパイのうち、
- 待ちが 2 種のものが一位で 102 通り (49.3%)
- 待ちが単騎のものが二位で 93 通り (44.9%)
- 待ちが 3 種のものがビリで 12 通り (5.8%) しかない。
むこうぶちの日蔭サンのすごさがよくわかる。 あとイーシャンテンのウェルカム牌の一覧も作れるが、ここでは省略する。
明日は一面子増やす方向に進めばいいのだろうか。考えないとわからない。 インターネットがないので自分でほとんどすべてをひねり出す。
気分転換に麻雀の練習をして 23:30 過ぎに消灯開始。
Programming Notes
Python の set は -= はあるのに += はない。代わりに |= と書く。不思議だ。
メソッド名で書くなら inplace な和集合と差集合処理はそれぞれ .update(), .update_difference() とする。
メソッド名で書くことはタイピングが面倒な一方、grep ができる。
itertools.combinations_with_replacement(range(1, 10), 4) により上述のような 4 数牌手牌をすべて得られる。
ただし、この手が通用するのは 4 枚まで。
標準モジュール math に関数 factorial(n), perm(n, k), comb(n, k) があるので有効に使え。
>>> 9 # AAAA
9
>>> perm(9, 2) # AAAB
72
>>> comb(9, 2) # AABB
36
>>> 9 * comb(8, 2) # AABC
252
>>> comb(9, 4) # ABCD
126