Example #1
0
        private int IndexConsideringTooLowPreviousResult(WordFindingLimit maxLowerLimit, WordFindingLimit minUpperLimit, Word target)
        {
            if (AreLowerAndUpperLimitsDefined(maxLowerLimit, minUpperLimit))
            {
                return(BinarySearch(maxLowerLimit.Index, minUpperLimit.Index));
            }

            var scoreByIndexPosition      = maxLowerLimit.Index / maxLowerLimit.Word.Score;
            var indexOfTargetBasedInScore = (int)(target.Score * scoreByIndexPosition);

            return(indexOfTargetBasedInScore);
        }
Example #2
0
        public WordFindingResult FindWord(string word)
        {
            var callsCount = 0;
            var lowerLimit = new WordFindingLimit(0, null);
            var upperLimit = new WordFindingLimit(int.MaxValue, null);
            var wordToFind = new Word(word);
            var wordIndex  = _initialIndex;

            while (callsCount <= _maximumCallsCount)
            {
                if (CouldNotFindWord(lowerLimit, upperLimit))
                {
                    return(new WordFindingResult(callsCount, -1, string.Empty, WordFindingResult.ErrorCodes.NOT_FOUND));
                }

                var wordFound = RetrieveWordAt(wordIndex);
                callsCount++;

                if (wordToFind.Equals(wordFound))
                {
                    return(new WordFindingResult(callsCount, wordIndex, wordFound.OriginalWordString));
                }

                else if (IsIndexTooHigh(wordToFind, wordFound))
                {
                    upperLimit = new WordFindingLimit(wordIndex, wordFound);
                    wordIndex  = IndexConsideringTooHighPreviousResult(lowerLimit, wordIndex);
                }
                else
                {
                    lowerLimit = new WordFindingLimit(wordIndex, wordFound);
                    wordIndex  = IndexConsideringTooLowPreviousResult(lowerLimit, upperLimit, wordToFind);
                }
            }
            return(new WordFindingResult(callsCount, -1, string.Empty, WordFindingResult.ErrorCodes.CALLS_LIMIT_EXCEEDED));
        }
Example #3
0
 private int IndexConsideringTooHighPreviousResult(WordFindingLimit maxLowerLimit, int current)
 {
     return(BinarySearch(maxLowerLimit.Index, current));
 }
Example #4
0
 private bool CouldNotFindWord(WordFindingLimit lowerLimit, WordFindingLimit upperLimit)
 {
     return(lowerLimit.Index >= (upperLimit.Index - 1));
 }
Example #5
0
 private bool AreLowerAndUpperLimitsDefined(WordFindingLimit lowerLimit, WordFindingLimit upperLimit)
 {
     return(upperLimit.Index < int.MaxValue && lowerLimit.Index > 0);
 }