internal void Run()
        {
            var digits = Enumerable.Range(0, 10).ToArray();
            var cmb    = new Combinatorics();
            var maxSol = 0L;

            cmb.GeneratePermutations(digits, 10, arr => {
                var number = new string(arr.Select(c => (char)('0' + c)).ToArray());
                var check  = true;
                for (var i = 0; i < arr.Length - 1; i++)
                {
                    var neighborSum = (arr[i] + arr[i + 1]).ToString();
                    if (!number.Contains(neighborSum))
                    {
                        check = false;
                        break;
                    }
                }
                if (check)
                {
                    var sol = Int64.Parse(number);
                    if (sol > maxSol)
                    {
                        maxSol = sol;
                    }
                }
            }, (candidate, countSoFar, partialSolution) => {
                return(countSoFar > 0 || candidate != 0);
            });
            Console.WriteLine(maxSol);
            return;
        }
 internal void Run()
 {
     List<int[]> combos = new List<int[]>();
     var cmb = new Combinatorics();
     var numbers = Enumerable.Range(1, 20).ToArray();
     cmb.GenerateCombinations(numbers, 9, combo =>
     {
         if (combo.Sum() == 51)
         {
             combos.Add(combo.ToArray());
         }
     }, (itm, idx, partialCombo) => true);
     foreach (var combo in combos)
     {
         cmb.GeneratePermutations(combo, 9, result =>
          {
              return;
          }
         , (candidate, position, partialSolution) =>
          checkForSquareMagicSquare(candidate, position, partialSolution));
     }
     return;
 }
        internal void Run()
        {
            int counter     = 0;
            var c           = new Combinatorics();
            int letterCount = 7;
            var letters     = Enumerable.Range(0, letterCount).Select(offset => (char)(AChar + offset)).ToArray();

            var envelopments = new List <string>();

            c.GenerateAllTuples(letters, 3, tuple =>
            {
                var x = new string(tuple);
                envelopments.Add(x);
            }, checkWrongEnvelope);
            //Console.WriteLine(String.Join("\r\n", envelopments));
            c.GeneratePermutations(envelopments.ToArray(), letterCount, tuple =>
            {
                var y = string.Join(",", tuple);
                //Console.WriteLine(y);
                counter++;
                Debug.Assert(counter <= 3437316);
            }, checkEnvelopePosition);
            Console.WriteLine(counter);
        }