No Programming, No Life

プログラミング関連の話題や雑記

お題:ポーカーをGroovyで解いてみた

問題

ポーカー

5枚のカードを示す文字列を入力とし、ポーカーの役を出力せよ。
ただし:

一枚のカードは、スートを表す文字+ランクを表す文字列 で構成される。
スートを表す文字は、S, H, D, C のいずれか
ランクを表す文字列は、2, 3, ..., 9, 10, J, Q, K, A のいずれか
下表の役に対応すること。下表の役に該当しない場合は '--' を出力すること。
カードはジョーカーを含まない52枚から5枚が選ばれる。
不正な入力への対応は不要。

対応すべき役と、その役だった場合に出力する文字列は以下のとおり:

フォーカード : 4K
フルハウス : FH
スリーカード : 3K
ツーペア : 2P
ワンペア : 1P
上記のいずれにも該当しない : --

例えば、入力が「D3C3C10D10S3」ならフルハウスなので「FH」と出力する。
入力が「S8D10HJS10CJ」ならツーペアなので「2P」と出力する。

回答

考察

  • Groovyでの解答例は既に@さんが書いてらっしゃいましたが一応書いてみました。(しかもアルゴリズムも酷似してしまい、なんだかすみません。)
  • #countBy 使いたかっただけです。
  • enumをなんとかして使おうとしたため、変換処理まわりが却って回りくどい感じになってしまいました。
  • #toPat 内で結果を返す前に出力もしています。