Problem:
ポーカー

ポーカーの手札データを読み込んで、それぞれについてその役を出力するプログラムを作成してください。ただし、この問題では、以下のルールに従います。

ポーカーはトランプ 5 枚で行う競技です。

同じ数字のカードは 5 枚以上ありません。

ジョーカーは無いものとします。

以下のポーカーの役だけを考えるものとします。(番号が大きいほど役が高くなります。)

役なし(以下に挙げるどれにも当てはまらない)

ワンペア（2 枚の同じ数字のカードが1 組ある）

ツーペア（2 枚の同じ数字のカードが2 組ある）

スリーカード（3 枚の同じ数字のカードが1 組ある）

ストレート（5 枚のカードの数字が連続している）

ただし、A を含むストレートの場合、A で終わる並びもストレートとします。つまり、A を含むストレート
は、A 2 3 4 5 　と　10 J Q K A 　の２種類です。J Q K A 2 などのように、A をまたぐ並び
はストレートではありません。（この場合、「役なし」になります）。

フルハウス（3 枚の同じ数字のカードが1 組と、残りの2 枚が同じ数字のカード）

フォーカード（4 枚の同じ数字のカードが1 組ある）

Input

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

手札1,手札2,手札3,手札4,手札5

手札は、トランプのJ(ジャック) を11、Q(クイーン) を12、K(キング) を13、A（エース）を 1、その他はそれぞれの数字で表すこととします。

データセットの数は 50 を超えません。

Output

データセットごとに、手札によってできる最も高い役をひとつ出力してください。役の表記については出力例に従ってください。

Sample Input

1,2,3,4,1
2,3,2,3,12
12,13,11,12,12
7,6,7,6,7
3,3,2,3,3
6,7,8,9,10
11,12,10,1,13
11,12,13,1,2

Output for the Sample Input

one pair
two pair
three card
full house
four card
straight
straight
null

3 3 2 3 3 という手札であったときは、two pair ではなく four card です。

Solution in JAVA (judge verdict: Accepted)

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String line;

        while((line = br.readLine()) != null){
            String[] input = line.split(",");
            int[] cards = new int[5];

            // 特殊なstraight判定
            int[] special = {1,10,11,12,13};

            for(int i = 0; i < 5; i++){
                cards[i] = Integer.parseInt(input[i]);
            }

            Arrays.sort(cards);

            int tmp = 0;    // 比較対象の数字
            int same = 0;   // 前の数字と一致する回数
            boolean gtTwo = false; // 数字の一致する枚数が3枚以上かどうか
            boolean gtThree = false; // 数字の一致する枚数が4枚以上かどうか
            int count = 1;  // 今何枚連続で一致しているか

            for(int x : cards){
                if(tmp == x){
                    same++;
                    count++;
                    if(count > 2) gtTwo = true;
                    if(count > 3) gtThree = true;
                }else{
                    tmp = x;
                    count = 1;
                }
            }

            if(same == 3){
                if(gtThree){
                    System.out.println("four card");
                }else{
                    System.out.println("full house");
                }
            }else if(same == 2){
                if(gtTwo){
                    System.out.println("three card");
                }else{
                    System.out.println("two pair");
                }
            }else if(same == 1){
                System.out.println("one pair");
            }else if(same == 0){
                boolean isStraight = true;
                int run = cards[0];
                for(int i = 1; i < 5; i++){
                    if(cards[i] - run != 1){
                        isStraight = false;
                        break;
                    }
                    run = cards[i];
                }

                if(isStraight || Arrays.equals(cards, special)){
                    System.out.println("straight");
                }else{
                    System.out.println("null");
                }
            }

        } // end of while

    }
}