当時解説していたアルゴリズムはスペクトル分解法(勝手な命名)というやりかたでした。 ちょっと長くなりますが、かいつまんで紹介しますと。 1.牌のデータは数値(コード)として扱います。 一〜九万は1〜9、ソウズは11〜19、ピンズは21〜29、字牌は31〜37といったぐあい。 そして、ここでは判定が難しそうなところで 23344555566667 という並びのデータを例に取ります。 2.それぞれの牌が何枚づつあるかの統計を取ります。 これは配列などに入れて処理すれば楽にできます。上の例で言うと、 [2]=1 [3]=2 [4]=2 [5]=4 [6]=4 [7]=1 というような結果になります。これをもとに判定をします。 3.低いコードの牌から順番に見ていき、2枚以上ある牌はアタマになる可能性 があるので、1つ1つチェックします。 たとえば、上の例では3が2枚あるので、これをアタマとして形が成立するかを チェックします。 4.[3]の数をアタマとして取り除くために-2します。すると残りは、 [2]=1 [4]=2 [5]=4 [6]=4 [7]=1 になります。 5.次にメンツを取っていきます。やはり低いコードから見ていって、 3枚以上ある場合は刻子として数を-3します。 1〜2枚の場合は、順子になるはずなので、その次のコードと、そのまた次のコード を見ます。上の例では、[2]は1枚なので、[3]と[4]と[5]がそれぞれ1枚以上あるはず です。 6.しかし上の例では、[3]がありません。つまり、[3]をアタマにした場合は失敗という ことになります。こうなったら、次にアタマにするコードをさがします。 (すべてのアタマを試しても失敗の場合は役ができていないことになります) [4]をアタマにしてもやはり失敗なので、[5]をアタマにした場合を考えます。 [2]=1 [3]=2 [4]=2 [5]=2 [6]=4 [7]=1 アタマを除くと上のようになります。 7.ふたたびメンツを取ります。[2][3][4]が1枚以上あるので、それぞれの数を-1します。 すると下のようになります。 [3]=1 [4]=1 [5]=2 [6]=4 [7]=1 8.さらに[3][4][5]も取れるので、 [5]=1 [6]=4 [7]=1 となります。[5][6][7]も取ります。 9.こうなります。 [6]=3 3枚以上あるところは-3します。 これで、すべての牌がなくなりアガリの形になっていることになります。 10.以上の情報をもとに、どんな役になっているかを判定します。 順子や刻子を取る時に、どんなコードをいくつ取ったか、などの情報をとって おくと、役の判定に使うことができます。 たとえば、順子として取った数が4ならばピンフ(ほかにも判断しなければならない ものはありますが)、同じコードの順子を取っていたらイーペーコー。 順子のコードが0x,1x,2xのように下1ケタ共通ならば三色、といったぐあい。 役の判定には、それまでのゲーム展開の情報も用意しておかなければなりません。 面前か、鳴いた牌はどれか、ドラや風牌はどれか、アガリの牌はどれか…などなど。 符の計算も、それらの情報をもとに計算します。このあたりが、複雑でパズリックな 楽しみもあります(^^) また、特殊な形(チートイツや国士無双)は最初に特別にチェックします。