public static bool GetIsValidNextNumber(IList <BigInteger> previousNumbers, BigInteger nextNumber)
        {
            var pairSums = CombinationsHelper.CombinationsRosettaWoRecursion(previousNumbers.ToArray(), 2)
                           .Where(numberPair => numberPair[0] != numberPair[1])
                           .Select(numberPair => numberPair.Aggregate((item1, item2) => item1 + item2));
            var result = pairSums.Contains(nextNumber);

            return(result);
        }
예제 #2
0
        public static IList <long> GetAddressesWithMaskApplied(long decimalAddress, string mask)
        {
            var result = new List <long>();
            var binaryValueBitArray = Convert.ToString(decimalAddress, 2).PadLeft(36, '0').ToCharArray();

            for (int i = 0; i < 36; i++)
            {
                var maskBit = mask[i];
                if ('0'.Equals(maskBit))
                {
                    continue;
                }
                binaryValueBitArray[i] = maskBit;
            }
            var numberOfFloatingBits    = binaryValueBitArray.Where(b => 'X'.Equals(b)).Count();
            var floatingBitCombinations = CombinationsHelper.GetAllPossibleOutcomesOfNExperiments(new char[] { '0', '1' }, numberOfFloatingBits);
            var floatingBitPositions    = new List <int>();

            for (int i = 0; i < 36; i++)
            {
                if ('X'.Equals(binaryValueBitArray[i]))
                {
                    floatingBitPositions.Add(i);
                }
            }
            var addressBitArrays = new List <char[]>();

            foreach (var floatingBitComination in floatingBitCombinations)
            {
                var currentAddressBitArray = binaryValueBitArray.ToArray();
                for (int i = 0; i < numberOfFloatingBits; i++)
                {
                    var floatingBitPosition = floatingBitPositions[i];
                    currentAddressBitArray[floatingBitPosition] = floatingBitComination[i];
                }
                addressBitArrays.Add(currentAddressBitArray);
            }
            foreach (var addressBitArray in addressBitArrays)
            {
                var addressBinaryString = new string(addressBitArray);
                var address             = Convert.ToInt64(addressBinaryString, 2);
                result.Add(address);
            }

            return(result);
        }
예제 #3
0
        public static IList <int> GetNumbersThatSumToTarget(IList <int> numberList, int numberOfEntries, int targetSum)
        {
            var combinationsEnumerator = CombinationsHelper.CombinationsRosettaWoRecursion(numberList.ToArray(), numberOfEntries);

            foreach (var numberCombination in combinationsEnumerator)
            {
                var testSum = 0;
                foreach (var currentNumber in numberCombination)
                {
                    testSum += currentNumber;
                    if (testSum > targetSum)
                    {
                        break;
                    }
                }
                if (testSum == targetSum)
                {
                    return(numberCombination.ToList());
                }
            }
            return(new List <int>());
        }
예제 #4
0
        public IActionResult Combinations([FromQuery] int[] arr)
        {
            var result = CombinationsHelper.CombinationsRosettaWoRecursion(arr, 2);

            return(Ok(result));
        }