public async Task <string> ExecuteAsync(string[] data) { var bagRules = new List <BagRule>(); foreach (var rules in data) { var ruleParts = rules.Split(_bagToRuleDelimiter, StringSplitOptions.RemoveEmptyEntries); var bagRule = new BagRule(ruleParts[0]); if ((ruleParts[1] != _emptyBagPhrase)) { var containedBagsParts = ruleParts[1].Remove(ruleParts[1].Length - 1, 1).Split(_containedBagDelimiter, StringSplitOptions.RemoveEmptyEntries); var containedBags = containedBagsParts .Select(x => x.Replace(_bagsSuffix, string.Empty).Replace(_bagSuffix, string.Empty).Split(_bagRuleDelimiter, StringSplitOptions.RemoveEmptyEntries)) .Select(x => new BagContents(int.Parse(x[0]), string.Join(_bagRuleDelimiter, x.Skip(1)))) .ToList(); bagRule.AddContents(containedBags); bagRules.Add(bagRule); } else { bagRules.Add(bagRule); } } return(CountBags(bagRules).ToString()); }
public async Task <string> ExecuteAsync(string[] data) { var totalBagsNeeded = 0; var bagRules = new List <BagRule>(); foreach (var rules in data) { var ruleParts = rules.Split(_bagToRuleDelimiter, StringSplitOptions.RemoveEmptyEntries); var bagRule = new BagRule(ruleParts[0]); if ((ruleParts[1] != _emptyBagPhrase)) { var containedBagsParts = ruleParts[1].Remove(ruleParts[1].Length - 1, 1).Split(_containedBagDelimiter, StringSplitOptions.RemoveEmptyEntries); var containedBags = containedBagsParts .Select(x => x.Replace(_bagsSuffix, string.Empty).Replace(_bagSuffix, string.Empty).Split(_bagRuleDelimiter, StringSplitOptions.RemoveEmptyEntries)) .Select(x => new BagContents(int.Parse(x[0]), string.Join(_bagRuleDelimiter, x.Skip(1)))) .ToList(); bagRule.AddContents(containedBags); bagRules.Add(bagRule); } else { bagRules.Add(bagRule); } } var bagsToReview = new List <BagRule> { bagRules.FirstOrDefault(x => x.Bag == _targetBag) }; var allValidBags = new HashSet <string>(); BagsThatCouldContainTargetBag(bagRules, new List <string> { _targetBag }, ref allValidBags); totalBagsNeeded = allValidBags.Count; return(totalBagsNeeded.ToString()); }