Problem:
パズル

1 〜 9 の数字を 14 個組み合わせて完成させるパズルがあります。与えられた 13 個の数字にもうひとつ数字を付け加えて完成させます。

パズルの完成条件は

同じ数字を２つ組み合わせたものが必ずひとつ必要です。

残りの12 個の数字は、３個の数字の組み合わせ４つです。

３個の数字の組み合わせ方は、同じ数字を３つ組み合わせたものか、または３つの連続する数字を組み合わせたものです。ただし、9 1 2 のような並びは連続する数字とは認められません。

同じ数字は4 回まで使えます。

13 個の数字からなる文字列を読み込んで、パズルを完成することができる数字を昇順に全て出力するプログラムを作成してください。なお、1〜9 のどの数字を付け加えてもパズルを完成させることができないときは 0 を出力してください。

例えば与えられた文字列が 3456666777999 の場合

「2」があれば、　234 567 666 77 999

「3」があれば、　33 456 666 777 999

「5」があれば、　345 567 666 77 999

「8」があれば、　345 666 678 77 999

というふうに、2 3 5 8 のいずれかの数字が付け加えられるとパズルは完成します。「6」でも整いますが、5 回目の使用になるので、この例では使えないことに注意してください。

Input

入力は複数のデータセットからなります。各データセットとして、13 個の数字が１行に与えられます。データセットの数は 50 を超えません。

Output

データセットごとに、パズルを完成させることができる数字を昇順に空白区切りで１行に出力します。

Sample Input

3649596966777
6358665788577
9118992346175
9643871425498
7755542764533
1133557799246

Output for the Sample Input

2 3 5 8
3 4
1 2 3 4 5 6 7 8 9
7 8 9
1 2 3 4 6 7 8
0

Solution in Ruby (judge verdict: Accepted)

class Node
  attr_accessor :index, :list, :double

  def initialize(num_list)
    @list = num_list.dup
    @index = 0
    @double = false
  end

  def check
    @list.all?(&:zero?) && @double
  end

  def initialize_copy(orig)
    @list = orig.list.dup
    @double = orig.double
    @index = orig.index
  end

  def is_valid?
    !@list.find{|e| e > 4 }
  end
end

class Solver
  def initialize

    loop do
      number = gets

      break if number.nil?

      answer = []

      1.upto(9) do |num|
        if solver(number.chomp, num)
          answer << num
        end
      end

      puts answer.empty? ? 0 : answer.join(' ')
    end
  end

  def queue(list)
    res = Array.new(9, 0)

    list.each do |num|
      res[num-1] += 1
    end

    res
  end

  def solver(number, num)
    list = number.chars.map(&:to_i) + [num]

    num_list = queue(list)

    que = [Node.new(num_list)]

    while !que.empty?
      node = que.shift

      next unless node.is_valid?

      index = node.index

      return true if node.check
      next if index >= 9 || node.list[index] < 0

      if node.list[index] >= 3
        n = node.dup
        n.list[index] -= 3

        n.index += 1 if n.list[index].zero?
        que.push(n)
      end

      if node.list[index] >= 2 && !node.double
        n = node.dup
        n.list[index] -= 2
        n.double = true

        n.index += 1 if n.list[index].zero?
        que.push(n)
      end

      if node.list[index] >= 1 && node.index < 7
        n = node.dup
        n.list[index] -= 1
        n.list[index+1] -= 1
        n.list[index+2] -= 1

        n.index += 1 if n.list[index].zero?
        que.push(n)
      end

      if node.list[index].zero?
        n = node.dup
        n.index += 1
        que.push(n)
      end
    end

    false
  end
end

Solver.new