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