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 C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    class Tuple
    {
        public string Item1 { get; set; }
        public int Item2 { get; set; }
        public Tuple(string item1, int item2)
        {
            Item1 = item1;
            Item2 = item2;
        }
        public static Tuple Create(string item1, int item2)
        {
            return new Tuple(item1, item2);
        }
    }
    private static IEnumerable<List<T>> permutations<T>(List<T> ints, bool root = true)
    {
        if(ints.Count <= 0)
        {
            yield return new List<T>();
            yield break;
        }
        for(int i = 0; i < ints.Count; i++)
        {
            List<T> a = new List<T>(ints);
            a.RemoveAt(i);
            foreach(List<T> b in permutations(a, false))
            {
                b.Add(ints[i]);
                if(root) b.Reverse();
                yield return b;
            }
        }
    }
    private static IEnumerable<Tuple> Iter(List<int> ints)
    {
        if (ints.Count == 1)
        {
            yield return Tuple.Create(ints[0].ToString(), ints[0]);
            yield break;
        }
        for (int i = 1; i < ints.Count; i++)
        {
            var lhs = Iter(ints.Take(i).ToList()).GetEnumerator();
            var rhs = Iter(ints.Skip(i).ToList()).GetEnumerator();
            while (lhs.MoveNext() && rhs.MoveNext())
            {
                for (int j = 0; j < 3; j++)
                {
                    if (j == 0)
                        yield return Tuple.Create(string.Format("({0}+{1})", lhs.Current.Item1, rhs.Current.Item1),
                        lhs.Current.Item2+rhs.Current.Item2);
                    else if (j == 1)
                        yield return Tuple.Create(string.Format("({0}-{1})", lhs.Current.Item1, rhs.Current.Item1),
                        lhs.Current.Item2-rhs.Current.Item2);
                    else
                        yield return Tuple.Create(string.Format("({0}*{1})", lhs.Current.Item1, rhs.Current.Item1),
                        lhs.Current.Item2*rhs.Current.Item2);
                }
            }
        }
    }
    private static IEnumerable<string> Is10(List<int> ints)
    {
        foreach(var tpl in Iter(ints))
            if(tpl.Item2 == 10)
                yield return tpl.Item1;
    }
    public static void Main()
    {
	for(;;)
	{
	    string str = Console.ReadLine();
	    if(str == "0 0 0 0") { return; }
	    List<int> ints = str.Split(new char[]{' '}).AsEnumerable().Select(int.Parse).ToList();
            string result = null;
	    foreach(List<int> i in permutations(ints))
                result = Is10(i).FirstOrDefault(t => t != "");
            Console.WriteLine(result != null ? result : "0");
	}
    }
}