読者です 読者をやめる 読者になる 読者になる

ポーカーの役判定を Groovy で

勉強会 - 第一回 オフラインリアルタイムどう書くの参考問題 - Qiita

これを Groovy でやってみた。
判定が楽になっていいけど、ストレートやフラッシュがないのはなんでかね?

gist https://gist.github.com/4640261

package doukaku

import doukaku.Poker
import spock.lang.Specification
import spock.lang.Unroll


class PokerSpec extends Specification {
    @Unroll
    def "#hand の場合は #result を返す"() {
        setup:
        Poker sut = new Poker()

        expect:
        sut.judge(hand) == result

        where:
        hand            |result
        "S2HKD10CJCA"    |"-"
        "S2H3D10DKC2"    |"1P"
        "S2H3D10D2C10"    |"2P"
        "SAHAD10DAC2"    |"3K"
        "SAHAD10DACA"    |"4K"
    }

}
package doukaku

class Poker {
    final def handPattern = ['14':'4K', '23':'FH', '113':'3K', '122':'2P', '1112':'1P', '11111':'-']

    String judge(String hand) {
        def eachNumberCount = [:].withDefault {0}
        (hand =~ /([2-9AJQK]|10)/).each {
            ++eachNumberCount[it]
        }

        def countPattern = ""
        eachNumberCount.sort { it.value }.each {
            countPattern += it.value
        }
        handPattern[countPattern]
    }
}