見出し画像

逆引きメンチン

夏休みの自由研究

この季節になると、高校1年生の夏休みを思い出します。麻雀を打つ相手もおらず、バイトと独りメンチン練習に明け暮れた、あの熱い夏を。

いきなり暗い話からスタートしてしまいましたが、最近ちょっとメンチンを話題にしたことがあったので思い出しました。
今の時代なら、小学生の自由研究のテーマに麻雀が選ばれても、おかしくなかったりするのかもしれません。僕が令和の小学生に転生することがあったら、次のような自由研究を提出してみようと思います。

逆引きメンチン

手牌から待ちを見つけるのは当たり前。逆に、待ちから手牌を導けないか?という話。
これ、前に鈴木たろうプロがYouTubeでそういうプログラムを以前組んだ、っていう話をしてて「いつかやってみたいな」と思ってたやつです。そういえば、ドリブンズの新メンバートライアウトの記述問題で「2345待ちを書けるだけ書け」みたいな問題ありましたよね?これも解決しそうだな。そういえば、この時の記述問題の回答とか出てるのかな?久しぶりに公式ホームページに行ってみよう!!!
・・・ただいま。

さぁ!気持ちを切り替えて。
たまにメンチンって変な待ちありますよね!そういうのばっかり収集すれば、いざという時に役に立つかも。面白そうだからやってみましょう。

Python

プログラミング言語はPython。点数計算とかシャンテン数を調べる麻雀ライブラリがあるので。興味ある人のためにソースコード添付。

from mahjong.tile import TilesConverter
from mahjong.shanten import Shanten

men = ("123","234","345","456","567","678","789","111","222","333","444","555","666","777","888","999")
toi = ("11","22","33","44","55","66","77","88","99")
ta = ("12","13","23","24","34","35","45","46","56","57","67","68","78","79","89")
tan = ("1","2","3","4","5","6","7","8","9")

#関数

#待ち牌取得
#tehai:文字列
#ret 待ち牌
def get_machi(tehai):
	shanten = Shanten()
	ret = ""
	for n in tan:
		if(len(tehai) - len(tehai.replace(n,""))<4):
			if(shanten.calculate_shanten(TilesConverter.string_to_34_array(man=(tehai + n))) == -1):
				ret += n
	return ret

#4枚チェック
#ret 正常:1 4枚以上含まれる場合:0
def chk_4(tehai):
	ret = 1
	for n in tan:
		if(len(tehai) - len(tehai.replace(n,""))>4):
			ret = 0
			break
	return ret

#面子追加関数
#tehaiが規定数(デフォルト13)に到達したら待ちをリターン(再帰処理終了)
def add_mentsu(tehai):
	ret = ""
	if len(tehai) >= 13:
		ret = get_machi(tehai)
		print(''.join(sorted(tehai)) + "\t" + ret,file = f)
	else:
		for m in men:
			tmp = tehai + m
			if chk_4(tmp):
				ret = add_mentsu(tmp)
	return ret

#実行
f = open("machi.txt", "w")

#n面子 + 1対子 + 1塔子 n<3
for toitsu in toi:
	for tatsu in ta:
		add_mentsu( toitsu + tatsu )

#n面子 + 1単騎 n<4
for tanki in tan:
	add_mentsu(tanki)

f.close()

久しぶりにPythonを触る、ということで、厳しいご指導はスルーさせてください。処理速度のこととか、全然考えてないです。ごめんなさい。
とりあえず、面子塔子対子単騎の総組み合わせで動かしちゃえ!
(追記:七対子のことを忘れてました!でも変則待ち抽出がテーマ、ということでご容赦下さい。)

よし!13メガバイト、70万行のテキストデータが完成!実行時間1時間は掛からなかったな。・・・ごめん。反省してる。たぶん、高速化のロジック考えるより早いと思って。

2345待ち

PCに負荷をかけたことを反省しながら、出来たデータの重複削除をして・・・と。あと、4枚使いなどで待ちが成立しないやつも削除して、完成。

67万ほどの重複削除

それでも3万7千近くありますね。これをそのままスプレッドシートに載せるの、良くない気がする。たぶん怒られるやつだ。2345待ちだけ載っけるか。でも、7枚だけで待ちが成立してるやつとかもあるから、オリジナリティのあるやつだけフラグ立てて、、と。あ、7枚10枚も加えないと。

2223334
2223344
3444555
3344555
1112233344
3344455666
3344567888
1111223334555
3344455678999
3344566677788
3444566778888
3444567788889

できた!!たぶん、ユニークなのはこの辺だと思う!
7枚のヤツは自力で全正解したいな。時間かければ10枚も。13枚のヤツは、「へーこんなケースもあるんだー」でもいいかな。

麻雀の役には立たないかもしれないけど、考えると結構面白いです。少なくとも、プログラミングの練習にはなると思います。
あ!!これ使えば『次のメンチンのうち、同じ待ちの手牌を作りなさい』みたいな麻雀クイズ作れるな!!!

メンチンのバビィ

僕は高校時代の独り練習をしてたせいか、メンチンが大好きです。いつか誰かに『好きな役は?』と聞かれたら『メンチンリーチ』って答えようと思っているくらいです。『好き』と『得意』は違います。『得意』とは言ってません。

このnoteを書くにあたって、何回も「メンチン」とタイプしました。その都度、亡くなられた馬場裕一氏のことが頭を過ります。
お会いしたのは最強戦の予選で何回かだけ。多くの方がおっしゃられてるように、片山先生の漫画で馬場さんを知っていた僕も、『あ!馬場さんだ!!』となった記憶があります。
馬場さんの代名詞であるメンチンは、これからも、麻雀の様々な場面でたくさんのドラマを生むでしょう。そのうちの何回かに1回は、「メンチンのバビィっていたなぁ」と思い出したいです。

ありがとうございました。

(終)

いいなと思ったら応援しよう!