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.HashSet;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;



 class Main{
     public static void main(String args[]){
         Scanner sc = new Scanner(System.in);
         String line;
         while(sc.hasNext()){
             line=sc.nextLine();
             if(line.isEmpty())break;
             String[] split=line.split(",");
             int[] ints = new int[5]; for(int i=0;i<5;i++)ints[i]=Integer.parseInt(split[i]);
             if(!_4c(ints))if(!fullH(ints))if(!st(ints))if(!_3c(ints))if(!_2p(ints))if(!_1p(ints))
                 System.out.println("null");
         }
         
         
     }
     static boolean _4c(int[] ints){
         if(ints[1]==ints[2]&&ints[1]==ints[3]&&ints[1]==ints[4]){System.out.println("four card");
         return true;}
         int count=0; for(int x : ints) if(x==ints[0])count++;
         if(count==4){System.out.println("four card");return true;}
         return false;
     }
     static boolean fullH(int[] ints){
         HashSet<Integer>hs=new HashSet<Integer>();
         for(int x:ints) hs.add(x);
         if(hs.size()==2){System.out.println("full house"); return true;}
         return false;
     }
     static boolean st(int[] ints){
         TreeSet<Integer>hs=new TreeSet<Integer>();
         
         for(int x:ints) hs.add(x);
         if(hs.size()!=5)return false;
         if(hs.last()-hs.first()==4){System.out.println("straight");return true;}
         if(hs.first()==1){hs.remove(1);
             if(hs.first()==10)System.out.println("straight");return true;
        }return false;
     }
     static boolean _3c(int[] ints){
        for(int i=0; i<5;i++){
            int count=0;
            for(int j=i+1;j<5;j++){
                if(ints[i]==ints[j])count++;
            }
            if(count==3){System.out.println("three card");return true;}
        }
        return false;
     }
     static boolean _2p(int[] ints){
         TreeMap<Integer,Integer>tm=new TreeMap<Integer,Integer>();
         for(int in:ints){
             if(tm.containsKey(in))tm.put(in, tm.get(in)+1);
             else tm.put(in, 1);
         }
         if(tm.keySet().size()==3){System.out.println("two pair");return true;}
         return false;
     }
     static boolean _1p(int[] ints){
         for(int i=0; i<5;i++){
             for(int j=i+1;j<5;j++){
                 if(ints[i]==ints[j]){System.out.println("one pair");return true;}
         }
     }return false;}
 }