challenge ポーカーの役判定

引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。

条件:

  • スートはS,D,H,C、ランクはA,2~9,T,J,Q,Kのそれぞれ一文字で表します。
  • 手札は S2D5H3CQS9 のように10文字で指定されます。特にソートはされていません。
  • 手札にジョーカーは含まれません。
  • ストレートで取りうるランクの種類はA2345, 23456 ... 9TJQK, TJQKAの10種類で、JQKA2のようにK-A-2をまたぐものはストレートではありません。

実行例:

% ./poker SQSJSASKST
Royal flush

% ./poker D9D7D6D5D8
Straight flush

% ./poker C2D2S2H3H2
Four of a kind

% ./poker C2D3S2H3H2
Full house

% ./poker S9S4S8STSJ
Flush

% ./poker C4H7D5S6H3
Straight

% ./poker S6H6C5DQC6
Three of a kind

% ./poker S6HQC5DQC6
Two pair

% ./poker S6H4C5DQC6
One pair

% ./poker SJSQSKSAC2
No pair

お題にしようと思っていたのに間違えてしまいました。今から変更可能でしょうか?

(説明)
当初間違ってトピックに投稿していたので、このようなコメントを付けていたのですが、
このコメントに気づいた管理人さんにお題に移していただきました。
(最初の2つだけ投稿日時が早いのはそのためです)

Posted feedbacks - D

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import std.stdio;
import std.string;

string poker(string cards){
    auto suit = "SDHC";
    auto rankOrder = "A23456789TJQK";
    auto transRankOrder = "abcdefghijklm";
    auto transRank = translate(cards, maketrans(rankOrder, transRankOrder), suit).sort;

    int[char] rankCount;
    foreach(c; transRank){
        rankCount[c]++;
    }
    auto pairPattern = rankCount.values.sort;
    auto hand = pairPattern == [1, 1, 1, 2] ? "One pair" :
                pairPattern == [1, 2, 2] ? "Two pair" :
                pairPattern == [1, 1, 3] ? "Three of a kind" :
                pairPattern == [2, 3] ? "Full house" :
                pairPattern == [1, 4] ? "Four of a kind" : "";
    if(hand == ""){
        auto isFlush = cards[0] == cards[2] && cards[0] == cards[4] &&
                       cards[0] == cards[6] && cards[0] == cards[8];
        hand = find(transRankOrder, transRank) != -1 ?
                   (isFlush ? "Straight flush" : "Straight") :
               transRank == (transRankOrder[0] ~ transRankOrder[($ - 4)..$]) ?
                   (isFlush ? "Royal flush" : "Straight") :
               (isFlush ? "Flush" : "No pair");
    }
    return hand;
}

void main(){
    writefln(poker("SQSJSASKST")); // Royal flush
    writefln(poker("D9D7D6D5D8")); // Straight flush
    writefln(poker("C2D2S2H3H2")); // Four of a kind
    writefln(poker("C2D3S2H3H2")); // Full house
    writefln(poker("S9S4S8STSJ")); // Flush
    writefln(poker("C4H7D5S6H3")); // Straight
    writefln(poker("S6H6C5DQC6")); // Three of a kind
    writefln(poker("S6HQC5DQC6")); // Two pair
    writefln(poker("S6H4C5DQC6")); // One pair
    writefln(poker("SJSQSKSAC2")); // No pair
}

Index

Feed

Other

Link

Pathtraq

loading...