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); }
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)); }
private int IndexConsideringTooHighPreviousResult(WordFindingLimit maxLowerLimit, int current) { return(BinarySearch(maxLowerLimit.Index, current)); }
private bool CouldNotFindWord(WordFindingLimit lowerLimit, WordFindingLimit upperLimit) { return(lowerLimit.Index >= (upperLimit.Index - 1)); }
private bool AreLowerAndUpperLimitsDefined(WordFindingLimit lowerLimit, WordFindingLimit upperLimit) { return(upperLimit.Index < int.MaxValue && lowerLimit.Index > 0); }