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 Ruby (judge verdict: Accepted)

T = gets.to_i

T.times do
  ary_R = Array.new
  ary_G = Array.new
  ary_B = Array.new
  r_idx = 0
  g_idx = 0
  b_idx = 0 
  num = gets.chomp.split(' ').map(&:to_i)
  color = gets.chomp.split(' ')

  for i in 0..8
    case color[i]
    when 'R'
      ary_R[r_idx] = [num[i], color[i]]
      r_idx += 1
    when 'G'
      ary_G[g_idx] = [num[i], color[i]]
      g_idx += 1
    when 'B'
      ary_B[b_idx] = [num[i], color[i]]
      b_idx += 1
    end
  end

  set = 0
  data = [ ary_R.sort!, ary_G.sort!, ary_B.sort! ]

  data.each do |ary|
    next if ary.size < 3
    while true
      break if ary.size < 3
      card = ary.shift
      for i in 0...ary.size-1
        equal = 1
        snum = 1
        end_flag = 0
        case ary[i][0] - card[0]
        when 0
          equal += 1
        when 1
          snum += 1
        else
          break
        end

        for j in i+1...ary.size
          case ary[j][0] - card[0]
          when 0
            equal += 1
          when 2
            snum += 1
          else
            break
          end
          if equal == 3 || snum == 3
            set += 1
            ary.delete_at(ary.find_index(ary[i]))
            ary.delete_at(ary.find_index(ary[j-1]))
            end_flag = 1
            break
          end
        end
        break if end_flag == 1
      end
    end
  end
  case set
  when 3
    puts 1
  else
    puts 0
  end
 end