private int CountBagsInside(BagSpec bagToLookIn) { var count = 0; foreach (var bag in bagToLookIn.Bags) { count += bag.Amount; count += CountBagsInside(_bagSpecs.First(a => a.ColorName.Equals(bag.ColorName))) * (bag.Amount == 0 ? 1 : bag.Amount); } return(count); }
private bool CanHoldGoldBag(BagSpec bagSpec) { if (bagSpec.Bags.Any(a => a.ColorName.Equals(GoldBagName))) { return(true); } foreach (var bag in bagSpec.Bags) { var bagToSearch = _bagSpecs.FirstOrDefault(a => a.ColorName.Equals(bag.ColorName)); if (bagToSearch != null) { if (CanHoldGoldBag(bagToSearch)) { return(true); } } } return(false); }
private void ParseBagSpecifications(string pathToInput) { var input = System.IO.File.ReadAllLines(pathToInput); _bagSpecs = new List <BagSpec>(); foreach (var bagSpec in input) { //format: [Color] bags contain [amount] color bag(s) (,[amount] [color] bag(s).)* var mainBagRegexMatch = Regex.Match(bagSpec, @"(.+) bags contain"); var color = mainBagRegexMatch.Groups[1].ToString(); var mainBag = new BagSpec(color, 1); var subBagsRegex = new Regex(@"(\d+) ([a-z\s]+) bag"); foreach (Match match in subBagsRegex.Matches(bagSpec)) { var amount = match.Groups[1]; var subColor = match.Groups[2]; mainBag.Bags.Add(new BagSpec(subColor.ToString(), Convert.ToInt32(amount.ToString()))); } _bagSpecs.Add(mainBag); } }