Problem:
Problem C: ラミー

あなたの友達は最近 UT-Rummy というカードゲームを思いついた．

このゲームで使うカードには赤・緑・青のいずれかの色と1から9までのいずれかの番号が
つけられている．
このゲームのプレイヤーはそれぞれ9枚の手札を持ち，
自分のターンに手札から1枚選んで捨てて，
代わりに山札から1枚引いてくるということを繰り返す．
このように順番にターンを進めていき，
最初に手持ちのカードに3枚ずつ3つの「セット」を作ったプレイヤーが勝ちとなる．
セットとは，同じ色の3枚のカードからなる組で，すべて同じ数を持っているか
連番をなしているもののことを言う．
連番に関しては，番号の巡回は認められない．
例えば，7, 8, 9は連番であるが 9, 1, 2は連番ではない．

あなたの友達はこのゲームをコンピュータゲームとして売り出すという計画を立てて，
その一環としてあなたに勝利条件の判定部分を作成して欲しいと頼んできた．
あなたの仕事は，手札が勝利条件を満たしているかどうかを判定する
プログラムを書くことである．

Input

入力の1行目にはデータセット数を表す数 T
(0 < T ≤ 50) が与えられる．
この行に引き続き T 個のデータセットが与えられる．

各データセットは2行からなり，
1行目には i 番目
(i = 1, 2, ..., 9)
のカードの数字 ni
がそれぞれスペースで区切られて与えられ，
2行目には i 番目のカードの色を表す文字
ci
がそれぞれスペースで区切られて与えられる．
カードの数字
ni
は 1 ≤ ni ≤ 9
を満たす整数であり，
カードの色 ci
はそれぞれ “R”, “G”,
“B”
のいずれかの文字である．

1つのデータセット内に色と数字がともに同じカードが5枚以上出現することはない．

Output

各データセットにつき，勝利条件を満たしていれば
“1”，
そうでなければ “0” と出力せよ．

Sample Input

5
1 2 3 3 4 5 7 7 7
R R R R R R G G G
1 2 2 3 4 4 4 4 5
R R R R R R R R R
1 2 3 4 4 4 5 5 5
R R B R R R R R R
1 1 1 3 4 5 6 6 6
R R B G G G R R R
2 2 2 3 3 3 1 1 1
R G B R G B R G B

Output for the Sample Input

1
0
0
0
1

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace rummy
{
    class Program
    {
        static void Main(string[] args)
        {
            //??????????????°????¨????
            var read_text = Console.ReadLine();
            int round_num = int.Parse(read_text);

            //??????????????°???????????????
            for(var i = 0;i<round_num;i++)
            {
                var read_num = Console.ReadLine();
                var read_color = Console.ReadLine();

                var HandCard_obj = new HandCard(read_num, read_color);

                Console.WriteLine(HandCard_obj.judge_math() ? "1":"0");

            }

        }
    }

    /// <summary>
    /// ???????????????
    /// </summary>
    class HandCard
    {

        /// <summary>
        /// ???????????°?????¨????????????
        /// </summary>
        int[] hand_card_num = new int[9];
        string[] hand_card_color = new string[9];

        /// <summary>
        /// ????????????????¨????
        /// </summary>
        //public enum Color
        //{
        //    red,
        //    blue,
        //    gleen

        //}

        /// <summary>
        /// ?????????????????????
        /// ??????????????????
        /// </summary>
        /// <param name="card_num">?????????????????????????????????????????????</param>
        /// <param name="card_color">???????????????????????????????????????</param>
        public HandCard(string card_num,string card_color)
        {
            var sprit_num=card_num.Split(' ');
            var sprit_color=card_color.Split(' ');

            for(int i=0;i<sprit_num.Length;i++)
                hand_card_num[i] = int.Parse(sprit_num[i]);

            for (int i = 0; i < sprit_color.Length; i++)
                hand_card_color[i] = sprit_color[i] ;
        }

        /// <summary>
        /// ????????????????????¶?????????????????????????????§????????????
        /// </summary>
        /// <returns></returns>
        public bool judge_math()
        {
            int win_flg = 0;
            //????????????
            var color = new string[]{"R", "G", "B"};
            
            //??????????????¨?????????
            string judge_string="";

            foreach (string s in color)
            {
                if (color_filtering(s).Count > 0)
                {
                    if (color_filtering(s).Count % 3 != 0)
                        return false;

                    var judge_list = color_filtering(s);

                    foreach (int c in judge_list)
                        judge_string += c.ToString();

                    for (var i = 1; i <= 9; i++)
                    {

                        //???????????????
                        if (0 <= judge_string.IndexOf(i.ToString() + i.ToString() + i.ToString()))
                        {
                            win_flg++;
                            for (var j = 0; j < 3; j++)
                                judge_list.Remove(i);

                            if (judge_list.Count() < 3)
                                break;

                            judge_string = "";
                            foreach (int c in judge_list)
                                judge_string += c.ToString();

                            i--;

                        }
                    }

                    for (var i = 1; i < 8; i++)
                    {
                        if (judge_list.Contains(i) && judge_list.Contains(i + 1) && judge_list.Contains(i + 2))
                        {
                            win_flg++;
                            for (var j = 0; j < 3; j++)
                                judge_list.Remove(i + j);

                            if (judge_list.Count() < 3)
                                break;
                            i--;
                        }
                    }

                }
            }
            return win_flg >= 3 ? true:false;
        }

        /// <summary>
        /// ????????????????????????????????°??????????????§??????
        /// </summary>
        /// <param name="color">??????????????? R,G,B?????????</param>
        /// <returns>?????????????????????List</returns>
        private List<int> color_filtering(string  color)
        {
            //?????????????????????????????????????????????
            List<int> math_num = new List<int>();

            //???????????????????????????????????§?????´???????????????????????????????????????????????????????????\??????
            for(var i=0;i<hand_card_color.Length;i++)
                if(hand_card_color[i]==color)
                    math_num.Add(hand_card_num[i]);

            //???????????????????????????
            math_num.Sort();
            return math_num;
        }

    }
}