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);
        }
Exemple #2
0
            /// <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());
            }
Exemple #3
0
 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)));
     }
 }