[2016-02-10] Challenge #253 [Intermediate] Countdown (numbers game)

C# using System; using System.Collections.Generic;

namespace Challenge.Intermediate.Countdown
{
class MainClass
{

    public static void Main (string[] args)
    {
        string input = Console.ReadLine ();
        String[] substrings = input.Split(' '); 

        int[] number = new int[6];
        for (int i = 0; i < 6; i++) {
            number[i] = int.Parse (substrings[i]);
        }

        int result = int.Parse (substrings[7]);

        permute (number, 0, 5, result);
    }

    static void permute(int[] arry, int i, int n, int result)
    {
        int j;
        if (i == n) {
            mutate (arry, result);
        }
        else
        {
            for(j = i; j <=n; j++)
            {
                swap(ref arry[i],ref arry[j]);
                permute(arry,i+1,n, result);
                swap(ref arry[i], ref arry[j]); //backtrack
            }
        }
    }

    static void swap(ref int a, ref int b)
    {
        int tmp;
        tmp = a;
        a=b;
        b = tmp;
    }

    static void mutate(int[] numbers, int result){
        string ops = "+-*/";
        for (int i = 0; i < 4; i++) {
            int output = numbers[0];
            switch (ops[i]) {
            case '+': output = output + numbers[1]; break;
            case '-': output = output - numbers[1]; break;
            case '*': output = output * numbers[1]; break;
            case '/': output = output / numbers[1]; break;
            }
            for (int j = 0; j < 4; j++) {
                int output1 = output;
                if (output1 == 0)break;
                switch (ops[j]) {
                case '+': output1 = output1 + numbers[2]; break;
                case '-': output1 = output1 - numbers[2]; break;
                case '*': output1 = output1 * numbers[2]; break;
                case '/': output1 = output1 / numbers[2]; break;
                }
                for (int k = 0; k < 4; k++) {
                    int output2 = output1;
                    if (output2 == 0)break;
                    switch (ops[k]) {
                    case '+': output2 = output2 + numbers[3]; break;
                    case '-': output2 = output2 - numbers[3]; break;
                    case '*': output2 = output2 * numbers[3]; break;
                    case '/': output2 = output2 / numbers[3]; break;
                    }
                    for (int l = 0; l < 4; l++) {
                        int output3 = output2;
                        if (output3 == 0)break;
                        switch (ops[l]) {
                        case '+': output3 = output3 + numbers[4]; break;
                        case '-': output3 = output3 - numbers[4]; break;
                        case '*': output3 = output3 * numbers[4]; break;
                        case '/': output3 = output3 / numbers[4]; break;
                        }
                        for (int m = 0; m < 4; m++) {
                            int output4 = output3;
                            if (output1 == 0)break;
                            switch (ops[m]) {
                            case '+': output4 = output4 + numbers[5]; break;
                            case '-': output4 = output4 - numbers[5]; break;
                            case '*': output4 = output4 * numbers[5]; break;
                            case '/': output4 = output4 / numbers[5]; break;
                            }
                            if (output4==result) Console.WriteLine ("((((" + numbers [0] + ops [i] + numbers [1] + ")" + ops [j] + numbers [2] + ")" + ops [k] + numbers [3] + ")" + ops [l] + numbers [4] + ")" + ops [m] + numbers [5] + " = " + output4);
                        }
                    }
                }
            }
        }
    }
}

}

/r/dailyprogrammer Thread