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
のような形式の文字列です。見ての通り、各カードがコンマで区切られています。
各カードは
HJ
や
D10
のような形式です。最初の文字がスートを表しています。スートは
S
, H
, D
, C
のいずれかの文字で、それぞれ
♠, ♥, ♦, ♣
を表しています。
スートを除いた部分(つまり、
J
や
10
)がランクを表しており、ランクは
A
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, 10
, J
, Q
, K
のいずれかの文字列で、見た通りのものを表しています。
メソッドは、役がある場合は
:An
や
:scTP
のようなシンボルを返します。
役がない場合は
nil
を返します。
上記の仕様をチェックするための spec と、全てテストが通っているソースコードが
src.zip
内にあります。
リファクタリングしてください。