カードゲームの役の判定

概要

6枚のカードを使って行うカードゲームがあります。その役を判定するプログラムを書いて下さい。
役は下表のとおりです。

役名 記号 意味
アンサー An 同一ランクの4枚組と、同一ランクの2枚組 ♥2, ♠2, ♦2, ♣2, ♠A, ♥A
シンクダブルトリオ sDT 同一ランクの3枚組が、2組。
各3枚組は、スートの組み合わせが同一。
♠10, ♥10, ♦10, ♠Q, ♥Q, ♦Q
ダブルトリオ DT 同一ランクの3枚組が、2組。
sDT ではない。
♠10, ♣10, ♦10, ♠Q, ♥Q, ♦Q
シンクコントトリプルペア scTP 同一ランクの2枚組が、3組。
各2枚組はスートの組み合わせが同一。
3つのランクが連続している。
♠9, ♥9, ♠10, ♥10, ♠J, ♥J
コントトリプルペア cTP 同一ランクの2枚組が、3組。
3つのランクが連続している。
scTP ではない。
♠9, ♣9, ♠10, ♥10, ♦J, ♥J
シンクトリプルペア sTP 同一ランクの2枚組が、3組。
各2枚組はスートの組み合わせが同一。
scTP ではない。
♠9, ♥9, ♠10, ♥10, ♠A, ♥A
トリプルペア TP 同一ランクの2枚組が、3組。
scTP, sTP, cTP のいずれでもない。
♠3, ♥3, ♦10, ♥10, ♠A, ♣A

役名が長いので、以下、上表の記号を使います。

ルールの詳細

カード

カードはいわゆる普通のトランプです。ランクは2〜10、J、Q、K、A の 13種類。スートは ♠、、♣ の 4 種類です。都合、52種類のカードを使います。Joker は使いません。また、手札には全く同じカードは含まれません(つまり、手札に ♥A が2枚ある、というような状況は起こりません)。
手札は必ず6枚です。

ランクの連続

ランクは A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A のように並んでいると考えます。つまり、「A, 2, 3」や、「9, 10, J」、「J, Q, K」、「Q, K, A」などは連続したランクですが、「2, 4, 6」、「7, 10, K」 などは連続したランクではありません。
なお、「K, A, 2」は連続したランクとはみなされません。通常のポーカーと同じです。

手札の順序

手札にあるカードの順序は役に影響しません。例えば手札が ♥J, ♦10, ♥2, ♥10, ♠2, ♣J の場合、役は TP となります。

入力

入力は
HJ,D10,H2,H10,S2,CJ
のような形式の文字列です。見ての通り、各カードがコンマで区切られています。
各カードは HJD10 のような形式です。最初の文字がスートを表しています。スートは
S, H, D, C
のいずれかの文字で、それぞれ
♠, , , ♣
を表しています。
スートを除いた部分(つまり、 J10 )がランクを表しており、ランクは
A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K
のいずれかの文字列で、見た通りのものを表しています。

出力

メソッドは、役がある場合は :An:scTP のようなシンボルを返します。
役がない場合は nil を返します。

課題

上記の仕様をチェックするための spec と、全てテストが通っているソースコードが
src.zip
内にあります。
リファクタリングしてください。

補足