static int Pt1(Dictionary <string, BagRule> Rules) { BagRule shinyGold = Rules["shiny gold"]; HashSet <string> candidates = new HashSet <string>(); Stack <BagRule> bagStack = new Stack <BagRule>(); bagStack.Push(shinyGold); while (bagStack.Count > 0) { foreach (var cont in bagStack.Pop().ContainedBy) { candidates.Add(cont.ContainerColor); if (cont.ContainedBy.Count > 0) { bagStack.Push(cont); } } } return(candidates.Count); }
static int Pt2(Dictionary <string, BagRule> Rules) { BagRule shinyGold = Rules["shiny gold"]; Stack <BagRule> bagStack = new Stack <BagRule>(); int bags = 0; bagStack.Push(shinyGold); while (bagStack.Count > 0) { var rule = bagStack.Pop(); bags += rule.Contains.Values.Sum(); foreach (var k in rule.Contains.Keys) { for (var i = 0; i < rule.Contains[k]; i++) { bagStack.Push(k); } } } return(bags); }