Problem:
式

与えられた 4 つの 1 から 9 の整数を使って、答えが 10 になる式をつくります。
4 つの整数 a, b, c, d を入力したとき、下記の条件に従い、答えが 10 になる式を出力するプログラムを作成してください。また、答えが複数ある時は、最初に見つかった答えだけを出力するものとします。答えがない時は、0 と出力してください。

演算子として、加算 (+)、減算 (-)、乗算 (*) だけを使います。除算 (/) は使いません。使用できる演算子は３個です。

数を4つとも使わなければいけません。

4つの数の順番は自由に入れ換えてかまいません。

カッコを使ってもかまいません。使用できるカッコは３組（６個）以下です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおり：

a b c d

入力は４つの 0 で終了します。データセットの数は 40 を超えません。

Output

各データセットについて、与えられた 4 つの整数と上記の演算記号およびカッコを組み合わせて値が 10 となる式または 0 を１行に出力してください。式の文字列が 1024 文字を超えてはいけません。

Sample Input

8 7 9 9
4 4 4 4
5 5 7 5
0 0 0 0

Output for the Sample Input

((9 * (9 - 7)) - 8)
0
((7 * 5) - (5 * 5))

Solution in Ruby (judge verdict: Accepted)

require 'mathn'

class Solver
  def initialize

    loop do
      numbers = gets.chomp.split(' ').map(&:to_i)

      $answer = nil
      $list = nil

      break if numbers.all?(&:zero?)

      solver(numbers)

      unless $answer.nil?

        $answer.each do |index|
          $list[index*2..index*2+2] = "(#{$list[index*2]} #{$list[index*2+1]} #{$list[index*2+2]})"
        end

        puts $list
      else
        puts 0
      end
    end
  end

  def solver(numbers)
    operations = [:+, :-, :*]

    numbers.permutation(4) do |num_list|
      operations.repeated_permutation(3) do |opes|
        list = [ num_list[0], opes[0], num_list[1], opes[1], num_list[2], opes[2], num_list[3] ]
        index_list = []

        dfs( list, index_list )

        $list = list.dup
        return unless $answer.nil?
      end
    end
  end

  def dfs(list, index_list)

    if list.size == 3 && index_list.size == 2
      num = list[0].send(list[1], list[2])

      if num == 10
        index_list << 0

        $answer = index_list.dup
      end
    else
      0.upto(list.size/2-1) do |index|
        index_list << index
        tmp_list = list.dup
        r = tmp_list[index*2]
        o = tmp_list[index*2+1]
        t = tmp_list[index*2+2]

        tmp_list[index*2..index*2+2] = r.send(o, t)

        dfs( tmp_list, index_list )

        return index_list if index_list.size == 3
        #index_list.pop
      end
    end

    index_list.pop
  end
end

Solver.new