Example #1
0
        // 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;
        }
Example #2
0
        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();
        }
Example #3
0
        // 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;
        }
Example #4
0
        // 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;
        }
Example #5
0
        // 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;
        }
Example #6
0
        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);
        }
Example #7
0
        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;
                    }
                }
            });
        }