public static BagRules Parse(string rule) { rule = rule .Replace("bags", "") .Replace("bag", "") .Replace(".", ""); var bagAndContains = rule.Split("contain"); var name = bagAndContains[0].Trim(); var containedBags = bagAndContains[1].Split(','); Dictionary <string, int> canContain; if (containedBags[0].Trim() == "no other") { canContain = new Dictionary <string, int>(); } else { canContain = containedBags .Select(cb => cb.Split(" ", StringSplitOptions.RemoveEmptyEntries)) .ToDictionary( b => $"{b[1]} {b[2]}", b => int.Parse(b[0])); } var bag = new BagRules(name, canContain); return(bag); }
/// <summary> /// How many outer bags can carry a shiny gold one? /// </summary> public static int Solve(string bagRules) { var rules = bagRules .Split(Environment.NewLine) .Select(br => BagRules.Parse(br)); var bags = new Bags(rules); return(bags.CountShinyGold()); }
private static bool ContainsGold(BagRules rule, IEnumerable <BagRules> rules) { if (!rule.CouldHold.Any()) { return(false); } else if (rule.CouldHold.Keys.Contains(Day7.ShinyGold)) { return(true); } else { return(rules .Where(r => rule.CouldHold.ContainsKey(r.Name)) .Any(r => ContainsGold(r, rules))); } }