/// <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); }
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); }
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"); } }