Ejemplo n.º 1
0
        private int Run(RulesInput input, bool isPart2)
        {
            var rules = input.Rules.ToList();

            if (isPart2)
            {
                rules.Add(new Rule
                {
                    Id       = 8,
                    SubRules = new List <int>
                    {
                        42, 8
                    }
                });
                rules.Add(new Rule
                {
                    Id       = 11,
                    SubRules = new List <int> {
                        42, 11, 31
                    }
                });
            }
            var matcher = new RuleMatcher(rules);
            int count   = 0;

            foreach (var msg in input.Messages)
            {
                if (matcher.IsMatch(msg))
                {
                    count++;
                }
            }
            return(count);
        }
Ejemplo n.º 2
0
        private RulesInput ParseInput(string input)
        {
            var result = new RulesInput();

            var lines = input.Trim().SplitByLine();

            foreach (var line in lines)
            {
                if (_regex.IsMatch(line))
                {
                    var match = _regex.Match(line);
                    if (match.Groups[2].Success)
                    {
                        result.Rules.Add(new Rule
                        {
                            Id           = int.Parse(match.Groups[1].Value),
                            LiteralValue = match.Groups[2].Value
                        });
                    }
                    else
                    {
                        var sequence          = new List <int>();
                        var alternateSequence = new List <List <int> > {
                            sequence
                        };
                        for (var i = 0; i < match.Groups[4].Captures.Count; i++)
                        {
                            if (match.Groups[3].Captures[i].Length != 0)
                            {
                                alternateSequence.Add(sequence = new List <int>());
                            }
                            sequence.Add(int.Parse(match.Groups[4].Captures[i].Value));
                        }
                        foreach (var altSeq in alternateSequence)
                        {
                            result.Rules.Add(new Rule
                            {
                                Id       = int.Parse(match.Groups[1].Value),
                                SubRules = altSeq
                            });
                        }
                    }
                }
                else
                {
                    result.Messages.Add(line);
                }
            }
            return(result);
        }