一人麻雀

高橋くんは最強最速の麻雀AIを作るため、手始めに一人麻雀での和了速度を最強最速にすることにしました。しかし高橋くんは最近社長業に忙しいため、プログラミングの腕が立つと評判のあなたに頼んできました。*1

関数を2つ実装し、以下の目的の通り最適化せよ。
入力の生成方法などの細かい仕様については、テスターを参照すること。

目的

手牌が上がりの状態になるまでの順目数を最小化(1000局くらい打って平均を取る)

実装する関数の仕様

void hitori_ai::haipai(vector haipai);
局の開始時に呼ばれる。
引数:
tehai 長さ13の配牌。牌の表し方は、0~8=1m~9m,9~17=1p~9p,18=26=1s~9s,27~33=東~中
返り値:
無し

int hitori_ai::select(int tsumopai);
引数:
tsumopai ツモった牌。
返り値:
切る牌。インデックスではなく、tehaiに含まれる要素を返す。

テスター

http://www3257ui.sakura.ne.jp/hitori/hitori_1.0.zip

$ make
$ ./main 100

とやると、100局での和了順目の平均がstdoutに出力される。

テスターにバグ疑惑?

適当に作ったアルゴリズム(テスターに同梱のexample.cpp)が35順とか掛かってて多すぎなような...。なんかバグってる?シャンテン数は、かなりテストしたやつをほぼそのまま使ってるから大丈夫だと思うんですが...

追記:
自分で一人麻雀練習機で遊んでみたら意外と和了れなかったのでバグってない可能性も出てきた。

追記2:
酷い仕様バグが...。実装する関数を void haipai(vector) と、int select(int pai) に変更。こうしないと、捨てた牌の情報とか使えないですよね。。。

*1:この高橋くんは某AtC○der社長とはなんの関係もありません