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.Text.RegularExpressions;
using System.Collections;
using System.Linq;

namespace Program
{
    class Program
    {
        // ソートをするメソッド
        private static void sort(List<string> card)
        {
            var list = card.Select(title => new { Name = title, Index = ToInt(title) })
                .OrderBy(title => title.Index).Select(title => title.Name);

            var sort = string.Join(",", list);
            string[] sortColor = sort.Split(',');

            for(int i = 0; i < sortColor.Length; i++)
            {
                for(int j = i + 1; j < sortColor.Length; j++)
                {
                    if(sortColor[i] == sortColor[j])
                    {
                        string temp = sortColor[j];
                        sortColor[j] = sortColor[j - 1];
                        sortColor[j - 1] = temp;
                    }
                }
            }
            card.Clear();
            card.AddRange(sortColor);
        }

        //　文字列に含まれる数値を見つけ出す
        private static int ToInt(string text)
        {
            return int.Parse(Regex.Replace(text, @"[^0-9]", ""));
        }

        // 数値とカラーが３つ同じものを見つけ出す
        private static void NumberColorCheck(List<string> card)
        {
            for (int i = 0; i < card.Count;)
            {
                if (card.Count < 3)
                {
                    break;
                }
                if (i == card.Count - 2)
                {
                    break;
                }

                if (card[i] == card[i + 1])
                {
                    if (card[i + 1] == card[i + 2])
                    {
                        card.RemoveAt(i);
                        card.RemoveAt(i);
                        card.RemoveAt(i);
                        i = 0;
                    }
                    else
                    {
                        i++;
                    }
                }
                else
                {
                    i++;
                }
            }
        }

        // 同一数値かつカラーがRGB順か確認するメソッド
        private static void SameNumberTurnColor(List<string> card)
        {
            for(int i = 0; i < card.Count;)
            {
                if (card.Count < 3)
                {
                    break;
                }
                if (i == card.Count - 2)
                {
                    break;
                }

                if (card[i].Substring(0, 1) == card[i + 1].Substring(0, 1))
                {
                    if (card[i].Substring(0, 1) == card[i + 2].Substring(0, 1))
                    {
                        if (card[i].Substring(1, 1) == "R" && card[i + 1].Substring(1, 1) == "G" && card[i + 2].Substring(1, 1) == "B")
                        {
                            card.RemoveAt(i);
                            card.RemoveAt(i);
                            card.RemoveAt(i);
                            i = 0;
                        }
                        else
                        {
                            i++;
                        }
                    }
                    else
                    {
                        i++;
                    }
                }
                else
                {
                    i++;
                }
            }
        }


        static void Main(string[] args)
        {
            // データセット数を取得
            var dataSetNumber = int.Parse(Console.ReadLine());

            // 勝利条件を格納するリスト
            var results = new List<int>();

            // ９枚のカードの数値と色を取得

            for (int i = 0; i < dataSetNumber; i++)
            {
                var cardNumColor = new List<string>();

                int[] number = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
                string[] color = Console.ReadLine().Split(' ');
                for (int j = 0; j < 9; j++)
                {
                    cardNumColor.Add(number[j].ToString() + color[j]);
                }

                // ソートする
                sort(cardNumColor);

                // 同一の数値とカラーを探す
                NumberColorCheck(cardNumColor);

                if (cardNumColor.Count >= 3)
                {
                    // 連番チェック
                    var serial = new List<string>();

                    for (int j = 0; j < cardNumColor.Count; j++)
                    {
                        var memory1 = 0;
                        var memory2 = 0;
                        bool rgbJudg = true;
                        bool flg1 = true;
                        bool flg2 = true;
                        serial.Add(cardNumColor[0]);
                        for (int z = 1; z < cardNumColor.Count; z++)
                        {
                            if (int.Parse(cardNumColor[0].Substring(0, 1)) + 1 == int.Parse(cardNumColor[z].Substring(0, 1)) && flg1 == true)
                            {
                                if (cardNumColor[0].Substring(1, 1) == cardNumColor[z].Substring(1, 1))
                                {
                                    serial.Add(cardNumColor[z]);
                                    memory1 = z;
                                    flg1 = false;
                                }
                                if(cardNumColor[0].Substring(1, 1) == "R" && cardNumColor[z].Substring(1, 1) == "G")
                                {
                                    serial.Add(cardNumColor[z]);
                                    memory1 = z;
                                    flg1 = false;
                                    rgbJudg = false;
                                }
                            }
                            if (int.Parse(cardNumColor[0].Substring(0, 1)) + 2 == int.Parse(cardNumColor[z].Substring(0, 1)) && flg2 == true)
                            {
                                if (cardNumColor[0].Substring(1, 1) == cardNumColor[z].Substring(1, 1))
                                {
                                    serial.Add(cardNumColor[z]);
                                    memory2 = z;
                                    flg2 = false;
                                }
                                if (cardNumColor[0].Substring(1, 1) == "R" && cardNumColor[z].Substring(1, 1) == "B" && rgbJudg == false)
                                {
                                    serial.Add(cardNumColor[z]);
                                    memory2 = z;
                                    flg2 = false;
                                }
                            }
                            if (serial.Count >= 3)
                            {
                                cardNumColor.RemoveAt(0);
                                cardNumColor.RemoveAt(memory1 - 1);
                                cardNumColor.RemoveAt(memory2 - 2);
                                serial.RemoveAt(0);
                                serial.RemoveAt(0);
                                serial.RemoveAt(0);
                                z = cardNumColor.Count;
                            }
                        }
                        if (flg1 == true || flg2 == true)
                        {
                            serial.Clear();
                            cardNumColor.RemoveAt(0);
                        }
                    }

                }

                if(cardNumColor.Count >= 3)
                {
                    // 同一の数値でカラーがRGB順を探す
                    SameNumberTurnColor(cardNumColor);
                }


                // 勝利条件を満たしているか判定
                if (cardNumColor.Count == 0)
                {
                    results.Add(1);
                }
                else
                {
                    results.Add(0);
                }
            }

            // 勝利条件の結果を出力
            foreach (int result in results)
            {
                Console.WriteLine(result);
            }
        }
    }
}