示例#1
0
        public List <string> GetRuleViolations(char[] romanNumeralCharacters)
        {
            List <char> notAllowedSubtractionSymbolsInRomanNumeral = null;

            for (var index = 0; index < romanNumeralCharacters.Length; index++)
            {
                var currentRomanNumeralCharacter = romanNumeralCharacters[index];
                if (index + 1 != romanNumeralCharacters.Length && romanNumeralCharacters[index] != romanNumeralCharacters[index + 1] && notAllowedSubtractionSymbols.Contains(currentRomanNumeralCharacter) &&
                    symbolValues.SymbolValues[currentRomanNumeralCharacter] < symbolValues.SymbolValues[romanNumeralCharacters[index + 1]])
                {
                    if (notAllowedSubtractionSymbolsInRomanNumeral == null)
                    {
                        notAllowedSubtractionSymbolsInRomanNumeral = new List <char>();
                    }
                    if (!notAllowedSubtractionSymbolsInRomanNumeral.Contains(currentRomanNumeralCharacter))
                    {
                        notAllowedSubtractionSymbolsInRomanNumeral.Add(currentRomanNumeralCharacter);
                    }
                }
            }
            if (notAllowedSubtractionSymbolsInRomanNumeral != null && notAllowedSubtractionSymbolsInRomanNumeral.Count > 0)
            {
                var violatingCharactersInRomanNumeral = CharactersUtility.GetFormattedCommaSeperatedCharacters(notAllowedSubtractionSymbolsInRomanNumeral);
                return(new List <string> {
                    { violatingCharactersInRomanNumeral + " can never be subtracted." }
                });
            }
            return(null);
        }
        public List <string> GetRuleViolations(char[] romanNumeralCharacters)
        {
            var symbolsWithExceededNumberOfRepetitionsInRomanNumeral = CharactersUtility.GetAllCharactersSatisfyingNumberOfSuppliedRepetitionsOrMore(romanNumeralCharacters, maxAllowedNumberOfRepetitions, allowedRepetitionSymbols);

            if (symbolsWithExceededNumberOfRepetitionsInRomanNumeral != null && symbolsWithExceededNumberOfRepetitionsInRomanNumeral.Length > 0)
            {
                var violatingCharactersInRomanNumeral = CharactersUtility.GetFormattedCommaSeperatedCharacters(symbolsWithExceededNumberOfRepetitionsInRomanNumeral);
                return(new List <string> {
                    { violatingCharactersInRomanNumeral + " can never be repeated more than " + maxAllowedNumberOfRepetitions + " times ." }
                });
            }
            return(null);
        }
示例#3
0
        public List <string> GetRuleViolations(char[] romanNumeralCharacters)
        {
            var notAllowedRepetitionSymbolsInRomanNumeral = CharactersUtility.GetAllCharactersSatisfyingNumberOfSuppliedRepetitionsOrMore(romanNumeralCharacters, charactersToCheck: notAllowedRepetitionSymbols);

            if (notAllowedRepetitionSymbolsInRomanNumeral != null && notAllowedRepetitionSymbolsInRomanNumeral.Length > 0)
            {
                var violatingCharactersInRomanNumeral = CharactersUtility.GetFormattedCommaSeperatedCharacters(notAllowedRepetitionSymbolsInRomanNumeral);
                return(new List <string> {
                    { violatingCharactersInRomanNumeral + " can never be repeated." }
                });
            }
            return(null);
        }
示例#4
0
        public override void Store(string normalInput)
        {
            var trimmedNormalInput = normalInput.Trim();

            ContractUtility.Requires <ArgumentException>(trimmedNormalInput.Contains(" is "), "normalInput must contain \" is \"");
            var normalInputWordsBeforeAndAfterIs = trimmedNormalInput.Split(new string[] { " is " }, StringSplitOptions.None).Where(x => !String.IsNullOrEmpty(x));

            var normalInputWordBeforeIs = normalInputWordsBeforeAndAfterIs.FirstOrDefault();

            ContractUtility.Requires <ArgumentException>(!String.IsNullOrEmpty(normalInputWordBeforeIs) && !String.IsNullOrWhiteSpace(normalInputWordBeforeIs), "Some data must be there before \"is\" in normalInput");
            ContractUtility.Requires <ArgumentException>(!normalInputWordBeforeIs.Trim().Contains(" "), "Cannot have > 1 intergalactic words before \"is\" in normalInput");
            ContractUtility.Requires <ArgumentException>(!normalInputMappingsWithTerminalIsExpressions.ContainsKey(normalInputWordBeforeIs), "normalInput is already stored");

            var normalSymbolAfterIs = normalInputWordsBeforeAndAfterIs.LastOrDefault();

            ContractUtility.Requires <ArgumentException>(!String.IsNullOrEmpty(normalSymbolAfterIs) && !String.IsNullOrWhiteSpace(normalSymbolAfterIs), "Some data must be there after \"is\" in normalInput");
            ContractUtility.Requires <ArgumentException>(!normalSymbolAfterIs.Trim().Contains(" "), "Cannot have > 1 symbols after \"is\" in normalInput");
            var validSymbols = symbolValues.SymbolValues.Keys;

            ContractUtility.Requires <ArgumentException>(validSymbols.Select(x => x.ToString()).Contains(normalSymbolAfterIs.Trim()), "The symbol after \"is\" in normalInput must be " + CharactersUtility.GetFormattedCommaSeperatedCharacters(validSymbols, "or") + " .");

            var terminalIsExpression = new TerminalIsExpression <string, string>(normalInputWordBeforeIs, normalSymbolAfterIs);

            normalInputMappingsWithTerminalIsExpressions.Add(normalInputWordBeforeIs, terminalIsExpression);
        }
        private char[] GetRomanNumeralCharactersAfterCheckingAllRules(string romanNumeral)
        {
            var romanNumeralCharacters = romanNumeral.ToCharArray();
            var notSupportedCharacters = romanNumeralCharacters.Except(symbolValues.SymbolValues.Keys.ToArray());

            ContractUtility.Requires <InvalidCastException>(notSupportedCharacters == null || notSupportedCharacters.Count() < 1, () => "The character(s) viz. " + CharactersUtility.GetFormattedCommaSeperatedCharacters(notSupportedCharacters) + " are not supported.");
            if (this.ruleCheckers != null && this.ruleCheckers.Count > 0)
            {
                var rulesViolations = GetAllRulesViolations(romanNumeralCharacters);
                ContractUtility.Requires <ApplicationException>(rulesViolations == null || rulesViolations.Count < 1, () => rulesViolations.Aggregate((a, b) => a + Environment.NewLine + b));
            }
            return(romanNumeralCharacters);
        }
示例#6
0
        public List <string> GetRuleViolations(char[] romanNumeralCharacters)
        {
            List <string> allowedNextSymbolForSubtractionRuleViolations = null;

            for (var index = 0; index < romanNumeralCharacters.Length; index++)
            {
                var currentRomanNumeralCharacter = romanNumeralCharacters[index];
                if (index + 1 != romanNumeralCharacters.Length && romanNumeralCharacters[index] != romanNumeralCharacters[index + 1] && allowedNextSymbolsForSubtraction.Any(x => x.Item1 == currentRomanNumeralCharacter))
                {
                    var allowedNextSymbolsForSubtractionValues = allowedNextSymbolsForSubtraction.Where(x => x.Item1 == currentRomanNumeralCharacter).Select(x => x.Item2);
                    if (!allowedNextSymbolsForSubtractionValues.Contains(romanNumeralCharacters[index + 1]))
                    {
                        if (allowedNextSymbolForSubtractionRuleViolations == null)
                        {
                            allowedNextSymbolForSubtractionRuleViolations = new List <string>();
                        }
                        allowedNextSymbolForSubtractionRuleViolations.Add(currentRomanNumeralCharacter + " can be subtracted from " + CharactersUtility.GetFormattedCommaSeperatedCharacters(allowedNextSymbolsForSubtractionValues) + " only");
                    }
                }
            }
            return(allowedNextSymbolForSubtractionRuleViolations);
        }