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)

op = ["+","-","*"]
p = op.product(op,op)

def convp(p, mode)
  st = []
  while p.size > 0
    x = p.shift
    if mode == 0
      case x
      when "+"
        st.push(st.pop+st.pop)
      when "-"
        st.push(-st.pop+st.pop)
      when "*"
        st.push(st.pop*st.pop)
      else #numeric
        st << x
      end
    else
      if x.to_s =~ /[1-9]/
        st.push(x.to_s)
      else
        a,b=st.pop,st.pop
        (x == "*" and b.size != 1) ? st.push("("+b+")"+" "+x+" "+a) : st.push("("+b+" "+x+" "+a+")")
      end
    end
  end
  return st
end

loop do
  e,f,g,h = gets.split.map(&:to_i)
  # puts "#{e},#{f},#{g},#{h}"
  break if e+f+g+h==0
  catch(:exit) do
    [e,f,g,h].permutation(4) do |a,b,c,d|
      p.each do |l|
        ln = Array.new(5){[a,b]}
        5.times do |idx|
          case idx
          when 0
            [ln[0],ln[1],ln[2]].each{|x| x << c}
            [ln[3],ln[4]].each{|x| x << l[0]}
          when 1
            ln[0] << d
            [ln[1],ln[2]].each{|x| x << l[0]}
            [ln[3],ln[4]].each{|x| x << c}
          when 2
            ln[0] << l[0]
            [ln[1],ln[4]].each{|x| x << d}
            [ln[2],ln[3]].each{|x| x << l[1]}
          when 3
            [ln[0],ln[1],ln[4]].each{|x| x << l[1]}
            [ln[2],ln[3]].each{|x| x << d}
          when 4
            ln.each{|x| x << l[2]}
          end
        end
        5.times do |i|
          lnb = Marshal.load(Marshal.dump(ln))
          if convp(ln[i], 0)[0] == 10
            puts convp(lnb[i],1)
            throw(:exit)
          end
        end
      end
    end
    p 0
  end
end