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

import scala.io.StdIn.readLine

object Main {
  def calc(c:Char,a:Int,b:Int) = c match { case '+' => a+b;case '-'=> a-b;case '*'=>a*b }
  def loop2(a:Int,b:Int,c:Int,d:Int,ops:List[List[Char]]):Boolean = ops match {
    case Nil => false
    case op::tl =>
      if(calc(op(2),calc(op(1),calc(op(0),a,b),c),d)==10) {
        printf("(((%d %c %d) %c %d) %c %d)\n",a,op(0),b,op(1),c,op(2),d);true
      }
      else if(calc(op(1),calc(op(0),a,b),calc(op(2),c,d))==10) {
        printf("((%d %c %d) %c (%d %c %d))\n",a,op(0),b,op(1),c,op(2),d);true
      } else loop2(a,b,c,d,tl)
  }

  def loop(l:Iterator[Array[Int]],ops:List[List[Char]]):Unit = {
    if(l.isEmpty) println(0)
    else {
      val Array(a,b,c,d):Array[Int] = l.next
      if(loop2(a,b,c,d,ops)) return
      else loop(l,ops)
    }
  }

  def main(args:Array[String]) = {
    Iterator.continually(readLine).takeWhile ( s => s != "0 0 0 0").foreach { s =>
      val l = s.split(" ").map(_.toInt).permutations
      val op = List('+','-','*')
      val ops = { for(i<-op;j<-op;k<-op) yield List(i,j,k) }.toList
      loop(l,ops)
    }
  }
}