예제 #1
0
        /// <summary>
        /// Uses optimises calculation for TotalCoin combinations
        /// because we know we only have Units in our set of coins
        /// that are successive multiples - e.g., 8,4,2,1 ...
        /// so can be optimized to avoid division.
        /// only triggers when the lowest unit fires and
        /// when our startingPoint = unitSum = '15' in above example
        /// is reached.
        /// Stores results in large array provided.  The implementation could be
        /// better de-coupled ... but this is efficient.
        /// </summary>
        /// <param name="source">value to calculate</param>
        /// <<param name="maximumCoins">max coins to generate</param>
        /// <param name="newNumberOfCoins"></param>
        /// <returns>Number of combinations found</returns>
        /// <exception cref="Exception">Exception if internal number of Tickers happens to be wrong ... shouldn;t happen</exception>
        public override Int64 Calculate(int source, int maximumCoins, Int64[] newNumberOfCoins)
        {
            Int64 cnt = 0;

            if (source >= unitSum && source % lowestFactor == 0)
            {
                var vals = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coin, source).ToList();

                if (vals.Count() == 7)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6]);
                }
                else if (vals.Count() == 6)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1], vals[2], vals[3], vals[4], vals[5]);
                }
                else if (vals.Count() == 5)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1], vals[2], vals[3], vals[4]);
                }
                else if (vals.Count() == 4)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1], vals[2], vals[3]);
                }
                else if (vals.Count() == 3)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1], vals[2]);
                }
                else if (vals.Count() == 2)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0], vals[1]);
                }
                else if (vals.Count() == 1)
                {
                    cnt = CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(newNumberOfCoins, maximumCoins, source, vals[0]);
                }
                else
                {
                    throw new Exception($"Unexpected number of values initialized - {vals.Count} > 7");
                }
            }

            return(cnt);
        }
예제 #2
0
        public static IEnumerable <Int64> Generate(CoinsLib.CombinationCalculator.Coin foo, int value, int max = 10000)
        {
            var arr = new Int64[value];

            var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(foo, value).ToArray();

            if (g.Length == 7)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1], g[2], g[3], g[4], g[5], g[6]);
            }
            if (g.Length == 6)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1], g[2], g[3], g[4], g[5]);
            }
            if (g.Length == 5)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1], g[2], g[3], g[4]);
            }
            if (g.Length == 4)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1], g[2], g[3]);
            }
            if (g.Length == 3)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1], g[2]);
            }
            if (g.Length == 2)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0], g[1]);
            }
            if (g.Length == 1)
            {
                CoinsForEvenFactors.CalculateTotalCoinsForEachComboAndReturnCount(arr, max, value, g[0]);
            }

            return(arr);
        }
예제 #3
0
파일: Program.cs 프로젝트: cjd0112/Coins
        static void Main(string[] args)
        {
            //TestVector.TestThis();

            var z3 = new Vector <short>(new short[] { 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0 });

            var mult = new Vector <short>(22);

            var jg = Vector.Equals(z3, new Vector <short>(0));

            var z4 = Vector.ConditionalSelect(jg, new Vector <short>(0), mult);

            Console.WriteLine(z4);

            var p = new Vector <short>(67);

            TestVector.Vector();

            Console.ReadLine();

            return;


            var z1 = new Tester2();

            if (args.Length > 1)
            {
                z1.RunTests(args[1]);
            }
            else
            {
                z1.RunTests();
            }

            if (args.Length == 0 || args.Length > 2)
            {
                Console.WriteLine("Expected either r 23 (run a value) or t (run tests)");
                return;
            }
            if (args[0] == "r")
            {
                int val = Convert.ToInt32(args[1]);
                var res2 = new Int64[val];
                var arr2 = new int[] { 6, 2, 1 }.ToList();

                Console.WriteLine($"Value,{val}");

                var coins = MagicPurse.GenerateTestCoin(arr2);
                if (arr2.Count == 1)
                {
                    var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coins, val)
                            .ToArray();
                    Printer.CalculateTotalCoinsForEachComboAndReturnCount(res2, val, g[0]);
                }
                if (arr2.Count == 2)
                {
                    var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coins, val)
                            .ToArray();
                    Printer.CalculateTotalCoinsForEachComboAndReturnCount(res2, val, g[0], g[1]);
                }
                else if (arr2.Count == 3)
                {
                    var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coins, val)
                            .ToArray();
                    Printer.CalculateTotalCoinsForEachComboAndReturnCount(res2, val, g[0], g[1], g[2]);
                }
                else if (arr2.Count == 4)
                {
                    var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coins, val)
                            .ToArray();
                    Printer.CalculateTotalCoinsForEachComboAndReturnCount(res2, val, g[0], g[1], g[2], g[3]);
                }
                else if (arr2.Count == 5)
                {
                    var g = ValuesAndMultiplesForEvenFactors.GenerateValuesAndMultiplesRecursive(coins, val)
                            .ToArray();
                    Printer.CalculateTotalCoinsForEachComboAndReturnCount(res2, val, g[0], g[1], g[2], g[3], g[4]);
                }
            }
            else if (args[0] == "t")
            {
                var z = new Tester();
                if (args.Length > 1)
                {
                    z.RunTests(args[1]);
                }
                else
                {
                    z.RunTests();
                }
            }


            return;


            bool printResults = false;

            var arr = new[] { 64, 32, 16, 8, 4, 2, 1 };

            Printer.Print(arr.Select(x => Convert.ToInt64(x)), "Initial array");

            var res = CompareThree.GetResults(arr, 234);



            Console.WriteLine("checking equals - Recursive vs. Uneven");

            Validator.CheckEquals(res.recursive, res.uneven);

            Console.WriteLine("checking equals - Uneven versus Even");

            Validator.CheckEquals(res.uneven, res.even);

            Console.WriteLine("checking equals - Recursive versus Even");

            Validator.CheckEquals(res.recursive, res.even);

            Console.WriteLine("finished");

            if (printResults)
            {
                Printer.Print(res.recursive, "Recursive");
                Printer.Print(res.uneven, "Uneven");
                Printer.Print(res.even, "Even");
            }
        }