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); }
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); }
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); }
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); }