// Format: [Name] is [Primitive] public bool Parse(string line, Context context) { if (line.EndsWith(Constants.QuestionMark)) { return false; } string[] fields = line.Split(new[] {Constants.ParserDelimiter}, StringSplitOptions.RemoveEmptyEntries); if (fields.Length != 2) { return false; } string right = fields[1].Trim(); if (right.Length != 1) { return false; } string[] left = fields[0].Split(new[] {Constants.Space}, StringSplitOptions.RemoveEmptyEntries); if (left.Length != 1) { return false; } RomanPrimitive primitive = RomanPrimitive.Parse(right[0]); if (primitive == null) { throw new ArgumentException(Constants.InvalidRomanPrimitive, right); } context.RomanMapping[left[0]] = primitive; return true; }
private static string SolveQuestion(ISolver[] solvers, Context context) { StringBuilder output = new StringBuilder(); context.Questions.ForEach(question => { bool solved = false; string answer = null; foreach (var solver in solvers) { try { solved = solver.Solve(question, context, out answer); } catch (Exception e) { Console.Error.WriteLine(e.Message); } if (solved) { break; } } output.AppendLine(solved ? answer : Constants.NotKnow); }); return output.ToString(); }
// Format: [Quantity] [Item] is [Amount] Credits public bool Parse(string line, Context context) { if (line.EndsWith(Constants.QuestionMark)) { return false; } string[] fields = line.Split(new[] {Constants.ParserDelimiter}, StringSplitOptions.RemoveEmptyEntries); if (fields.Length != 2) { return false; } string[] left = fields[0].Split(new[] {Constants.Space}, StringSplitOptions.RemoveEmptyEntries); if (left.Length < 2) { return false; } string[] right = fields[1].Split(new[] {Constants.Space}, StringSplitOptions.RemoveEmptyEntries); if (right.Length != 2) { return false; } string item = left.Last(); int quantity = Roman.Parse(string.Join(Constants.Space, left.Take(left.Length - 1)), context.RomanMapping); int amount = int.Parse(right[0]); decimal price = ((decimal) amount)/quantity; context.ItemPrice[item] = price; return true; }
// Format: [Question] ? public bool Parse(string line, Context context) { if (!line.EndsWith(Constants.QuestionMark)) { return false; } context.Questions.Add(line.Replace(Constants.QuestionMark, string.Empty)); return true; }
// Format: how much is [Quantity] public bool Solve(string line, Context context, out string answer) { if (!line.StartsWith(Constants.DefinitionQuestion)) { answer = null; return false; } string right = line.Substring(Constants.DefinitionQuestion.Length); int quantity = Roman.Parse(right, context.RomanMapping); answer = string.Format("{0}is {1}", right, quantity); return true; }
public static string Process(IEnumerable<string> lines) { IParser[] parsers = { new DefinitionParser(), new StatementParser(), new QuestionParser() }; ISolver[] solvers = { new DefinitionSolver(), new StatementSolver() }; Context context = new Context(); ParseConversation(lines, parsers, context); return SolveQuestion(solvers, context); }
private static void ParseConversation(IEnumerable<string> lines, IParser[] parsers, Context context) { lines.ToList().ForEach(line => { foreach (var parser in parsers) { bool parsed = false; try { parsed = parser.Parse(line, context); } catch (Exception e) { Console.Error.WriteLine(e.Message); } if (parsed) { break; } } }); }