前書き
以下の記事を見つけた。
真面目に組もうとすると難しいが
単純に考えると簡単。
前提としてアルゴリズムとしての美しさだとかは求めない。
さっさと実装しろや!と権力者に圧力をかけられているものとする。
あと、私は答えを知りたくなかったので他人の回答などは一切見ていないです。
1. 待ちの判定
両面待ちは6パターン
[23][34][45][56][67][78]
ペンチャン待ちは2パターン
[12][89]
カンチャン待ちは7パターン
[13][24][35][46][57][68][79]
単騎待ちは9パターン
[1][2][3][4][5][6][7][8][9]
シャボ待ちは9パターン
[11][22][33][44][55][66][77][88][99]
これらの待ちパターンが手牌に存在するかチェックすればいいだけの話。
(ノベタンは単騎待ちと同じだから考慮しなくてよい。)
2. 順子・刻子・雀頭の判定
前提として「1. 待ちの判定」が済まされた状態で
手配から待ちの牌が抜かれているものとする。
単騎待ち以外の待ちの場合
雀頭が1つ、順子・刻子が3つなければならない。
雀頭は9パターン
[11][22][33][44][55][66][77][88][99]
順子は7パターン
[123][234][345][456][567][678][789]
刻子は9パターン
[111][222][333][444][555][666][777][888][999]
律儀に各パターンがどーのこーのとやるのももちろんありだが、
限りなく思考停止したいなら全パターンすべてを調べるのが楽。
(実務だったら嫌われるだろうが、実装が単純で楽。)
具体的には
雀頭のパターン数 * 順子のパターン数 * 順子のパターン数 * 順子のパターン数 +
雀頭のパターン数 * 順子のパターン数 * 順子のパターン数 * 刻子のパターン数 +
雀頭のパターン数 * 順子のパターン数 * 刻子のパターン数 * 刻子のパターン数 +
雀頭のパターン数 * 刻子のパターン数 * 刻子のパターン数 * 刻子のパターン数
= 9 * 7 * 7 * 7 + 9 * 7 * 7 * 9 + 9 * 7 * 9 * 9 + 9 * 9 * 9 * 9
= 18720
18720パターンすべてで手配と一致するかを調べ、一致したら出力対象として記憶すればいい。
単騎待ちの場合
順子・刻子が4つなければならない。
もしくは対子が6つなければならない。
それ以外の考え方は「単騎待ち以外の待ちの場合」と同じなので省略。
3. 終わり
こんだけ説明したら後はプログラムに落とし込むだけ。
元記事では40分程度で実装できる人がいたそうだが、
自分はこの問題を渡された瞬間から40分でアルゴリズムを考えて実装できる自信が全くない。
信じられないくらいに脳が覚醒していれば1.5h、
スムーズにいけば2.5h、
バグにハマると5hくらいかかりそう。
というかこの問題、難しくない?
綺麗なアルゴリズムを考えてそれに落とし込もうとしたら1日以上はかかると思う。
40分での実装は
日頃から競プロを嗜んでいるとか、あらかじめチンイツの待ちの求め方を知っているとかでないと無理だと思う。