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: Wrong Answer)

import java.util.*;
import java.io.*;
import static java.lang.Math.*;

class Main {

    public static void main( final String[] args ) {

	final Scanner stdin = new Scanner( System.in );

	while ( stdin.hasNextLine() ) {

	    final String[] input = stdin.nextLine().split( "," );

	    int[] hand = new int[5];
	    for ( int i = 0; i < 5; i++ ) {
		hand[i] = Integer.parseInt( input[i] );
		if ( hand[i] == 1 ) {
		    hand[i] = 14;
		}
	    }

	    Arrays.sort( hand );
	    if ( isFourCard( hand ) ) {
		System.out.println( "four card" );
	    } else if ( isFullHouse( hand ) ) {
		System.out.println( "full house" );
	    } else if ( isStraight( hand ) ) {
		System.out.println( "straight" );
	    } else if ( isThreeCard( hand ) ) {
		System.out.println( "three card" );
	    } else if ( isTwoPair( hand ) ) {
		System.out.println( "two pair" );
	    } else if ( isOnePair( hand ) ) {
		System.out.println( "one pair" );
	    } else {
		System.out.println( "null" );
	    }
	}	
    }

    static int getDuplicateOf( int[] hands, int noOfDup ) {
	int ans = 0;
	
	int index = 0;
	while ( index < hands.length ) {
	    int no = hands[index];
	    int counter = 0;
	    while ( index < hands.length && no == hands[index] ) {
		counter++;
		index++;
	    }
	    if ( counter == noOfDup ) {
		ans++;
	    }
	}
	return ans;
    }

    static boolean isOnePair( int[] hand ) {
	return getDuplicateOf( hand, 2 ) == 1;
    }

    static boolean isTwoPair( int[] hand ) {
	return getDuplicateOf( hand, 2 ) == 2;
    }

    static boolean isThreeCard( int[] hand ) {
	return getDuplicateOf( hand, 3 ) == 1;
    }

    static boolean isFullHouse( int[] hand ) {
	return getDuplicateOf( hand, 2 ) == 1 &&
	    getDuplicateOf( hand, 3 ) == 1;
    }

    static boolean isFourCard( int[] hand ) {
	return getDuplicateOf( hand, 4 ) == 1;
    }

    static boolean isStraight( int[] hand ) {
	if ( 2 <= hand[0] && hand[0] <= 10 ) {
	    for ( int i = 0; i < 5; i++ ) {
		if ( hand[i] != hand[0] + i ) {
		    return false;
		}
	    }
	    return true;
	} else {
	    return false;
	}	   
    }
}