int GetCount(BagRule bagRule)
        {
            if (canHold.ContainsKey(bagRule.Name))
            {
                return(canHold[bagRule.Name]);
            }

            if (bagRule.Contains.Count == 0)
            {
                canHold[bagRule.Name] = 0;
                return(0);
            }
            else
            {
                var cnt = 0;
                foreach (var contains in bagRule.Contains)
                {
                    if (contains.Item1 == "shiny gold")
                    {
                        cnt += contains.Item2 * 1;
                    }
                    else
                    {
                        var targetBagRule = bagRules.FirstOrDefault(b => b.Name == contains.Item1);
                        cnt += contains.Item2 * GetCount(targetBagRule);
                    }
                }
                canHold[bagRule.Name] = cnt;
                return(cnt);
            }
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        private void GetBagsInside(BagRule bag, string input)
        {
            var splitOnComma = input.Split(',');

            foreach (var bagLine in splitOnComma)
            {
                bag.BagsInside.Add(GetBagColorAndNumber(bagLine));
            }
        }
        public void BagRuleTest1()
        {
            var bagRule = new BagRule("light red bags contain 1 bright white bag, 2 muted yellow bags.");

            bagRule.ContainerBag.Should().Be("light-red");
            bagRule.ContainedBags.Should().Equal(new List <Bag> {
                new Bag(1, "bright-white"), new Bag(2, "muted-yellow")
            });
        }
        public void BagRuleParsesInputCorrectly(int expectedCount, string expectedColour, string ruleAsString)
        {
            // Arrange / Act
            var sut = new BagRule(ruleAsString);

            // Assert
            sut.RequiredCount.Should().Be(expectedCount);
            sut.BagColour.Should().Be(expectedColour);
        }
Exemple #6
0
        public void CountAnswers2(string ruleString)
        {
            BagRule g = ruleString.ParseLuggageRule();

            g.BagColor.Should().Be("bright white");
            g.MustContain.Should().HaveCount(1);
            g.MustContain[0].Quantity.Should().Be(1);
            g.MustContain[0].Color.Should().Be("shiny gold");
        }
Exemple #7
0
        public void CountAnswers3(string ruleString)
        {
            BagRule g = ruleString.ParseLuggageRule();

            g.BagColor.Should().Be("muted yellow");
            g.MustContain.Should().HaveCount(2);
            g.MustContain[0].Quantity.Should().Be(2);
            g.MustContain[0].Color.Should().Be("shiny gold");
            g.MustContain[1].Quantity.Should().Be(9);
            g.MustContain[1].Color.Should().Be("faded blue");
        }
        private int GetNestedBagCount(BagRule bag)
        {
            int count = 0;

            foreach (var subBag in bag.Contents)
            {
                count += subBag.Value * GetNestedBagCount(bagRules.Single(b => b.Description == subBag.Key)) + subBag.Value;
            }

            return(count);
        }
Exemple #9
0
        public void CountAnswers1(string ruleString)
        {
            BagRule g = ruleString.ParseLuggageRule();

            g.BagColor.Should().Be("light red");
            g.MustContain.Should().HaveCount(2);
            g.MustContain[0].Quantity.Should().Be(1);
            g.MustContain[0].Color.Should().Be("bright white");
            g.MustContain[1].Quantity.Should().Be(2);
            g.MustContain[1].Color.Should().Be("muted yellow");
        }
Exemple #10
0
        private long CountNumberOfBagsInBag(BagRule bag)
        {
            long numberOfBags = 0;

            foreach (var bagInside in bag.BagsInside)
            {
                var bagsInside = bags.Where(x => x.Bag == bagInside.BagColor);
                numberOfBags += bagInside.NumberOfBags + bagInside.NumberOfBags * CountNumberOfBags(bagsInside);
            }

            return(numberOfBags);
        }
            public void AddRule(BagRule rule)
            {
                Rules.Add(rule.BagName, rule);

                foreach (BagWithCount bag in rule.ContainedBags)
                {
                    if (!ContainedBy.ContainsKey(bag.BagName))
                    {
                        ContainedBy[bag.BagName] = new List <string>();
                    }
                    ContainedBy[bag.BagName].Add(rule.BagName);
                }
            }
Exemple #12
0
    public static BagDefinition Parse(string input)
    {
        var definition = new BagDefinition();

        var inputs = input.Split(SPLIT_TERM);

        definition.Colour = inputs[0].Trim();

        var ruleDefinitions = inputs[1].Split(", ").Select(rd => rd.Trim());

        definition.Rules.AddRange(ruleDefinitions.Select(rd => BagRule.Parse(rd)));

        return(definition);
    }
Exemple #13
0
        private static async Task <Dictionary <string, BagRule> > ReadAndParseRules(string filename)
        {
            var result = new Dictionary <string, BagRule>();

            foreach (var item in await File.ReadAllLinesAsync(filename))
            {
                if (BagRule.TryParse(item, out var rule))
                {
                    result[rule.BagType] = rule;
                }
            }

            return(result);
        }
            public Int64 CountContainedBags(String bag)
            {
                Int64 count = 0;

                BagRule rule = Rules[bag];

                foreach (BagWithCount innerBag in rule.ContainedBags)
                {
                    long thisCount = innerBag.Count;
                    count += thisCount;
                    count += thisCount * CountContainedBags(innerBag.BagName);
                }

                return(count);
            }
        private bool RecurseRules(BagRule rule)
        {
            if (rule.Contents.ContainsKey(ruleTarget))
            {
                return(true);
            }

            foreach (var containedBag in rule.Contents)
            {
                if (RecurseRules(bagRules.Single(r => r.Description == containedBag.Key)))
                {
                    return(true);
                }
            }

            return(false);
        }
        public UInt64 Process(String[] input)
        {
            UInt64 result = 0;

            //            input = new String[] {
            //"light red bags contain 1 bright white bag, 2 muted yellow bags.",
            //"dark orange bags contain 3 bright white bags, 4 muted yellow bags.",
            //"bright white bags contain 1 shiny gold bag.",
            //"muted yellow bags contain 2 shiny gold bags, 9 faded blue bags.",
            //"shiny gold bags contain 1 dark olive bag, 2 vibrant plum bags.",
            //"dark olive bags contain 3 faded blue bags, 4 dotted black bags.",
            //"vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.",
            //"faded blue bags contain no other bags.",
            //"dotted black bags contain no other bags.",
            //            };

//            input = new string[] {
//"shiny gold bags contain 2 dark red bags.",
//"dark red bags contain 2 dark orange bags.",
//"dark orange bags contain 2 dark yellow bags.",
//"dark yellow bags contain 2 dark green bags.",
//"dark green bags contain 2 dark blue bags.",
//"dark blue bags contain 2 dark violet bags.",
//"dark violet bags contain no other bags.",
//            };

            BagRuleEngine rules = new BagRuleEngine();

            foreach (String line in input)
            {
                BagRule rule = new BagRule(line);
                rules.AddRule(rule);
            }

            String bag = "shiny gold";

            // Part 1
            //HashSet<String> containingBags = rules.Part1_FindContainingBags(bag);
            //result = (UInt64)containingBags.Count;

            // Part 2
            result = (UInt64)rules.CountContainedBags(bag);


            return(result);
        }
Exemple #17
0
        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());
        }
Exemple #18
0
        protected override void Initialize()
        {
            //content = GetExample();
            content = ReadFile();

            bags = new List <BagRule>();
            foreach (var line in content)
            {
                var splitOnContain = line.Split(" contain ");

                var bag = new BagRule(GetBagColorAndNumber(splitOnContain[0]).BagColor);

                if (splitOnContain[1] != "no other bags.")
                {
                    GetBagsInside(bag, splitOnContain[1]);
                }

                bags.Add(bag);
            }
        }
Exemple #19
0
        private int GetBagsInBag(string colour)
        {
            int     bags           = 1;
            BagRule currentBagRule = new BagRule();

            foreach (var bagRule in _bagRules)
            {
                if (bagRule.colour == colour)
                {
                    currentBagRule = bagRule;
                    break;
                }
            }

            foreach (var containsBag in currentBagRule.containsBags)
            {
                bags += containsBag.Value * GetBagsInBag(containsBag.Key);
            }

            return(bags);
        }
        private void ReadInput()
        {
            var input = File.ReadAllLines(Environment.CurrentDirectory + "/Input/Input7.txt");

            foreach (string line in input)
            {
                var rule = new BagRule()
                {
                    Contents    = new Dictionary <string, int>(),
                    Description = line.Substring(0, line.IndexOf("contain") - 6)
                };

                string contents = line.Substring(line.IndexOf("contain") + 8);

                while (true)
                {
                    if (contents.Contains("no other bags"))
                    {
                        break;
                    }

                    if (contents.IndexOf(',') == -1)
                    {
                        // last - break after this
                        string match2 = contents.Substring(0, contents.Length - 1);
                        rule.Contents.Add(match2.Substring(2, match2.Length - 6).Trim(), Convert.ToInt32(match2.Substring(0, 1)));

                        break;
                    }

                    // I'm not crying, you're crying
                    string match = contents.Substring(0, contents.IndexOf(','));
                    rule.Contents.Add(match.Substring(2, match.Length - 6).Trim(), Convert.ToInt32(match.Substring(0, 1)));

                    contents = contents.Substring(contents.IndexOf(',') + 2);
                }

                bagRules.Add(rule);
            }
        }
Exemple #21
0
        public Day7()
        {
            var inputList = _inputFiles.SplitString(_inputFiles.ReadInputFileForDay(7, false));

            foreach (var rule in inputList)
            {
                var ruleSplit = rule.Split(" ");
                var newRule   = new BagRule();
                newRule.colour = ruleSplit[0] + " " + ruleSplit[1];

                var rulePos = 4;
                while (ruleSplit.Length > rulePos)
                {
                    if (ruleSplit[rulePos] == "no")
                    {
                        break;
                    }

                    newRule.containsBags.Add(ruleSplit[rulePos + 1] + " " + ruleSplit[rulePos + 2], Int32.Parse(ruleSplit[rulePos]));
                    rulePos += 4;
                }
                _bagRules.Add(newRule);
            }
        }
Exemple #22
0
    public static BagRule Parse(string ruleString)
    {
        var rule = new BagRule();

        if (ruleString.Equals("no other bags.", StringComparison.CurrentCultureIgnoreCase))
        {
            rule.NumberOfBags = 0;
            return(rule);
        }

        var parts = ruleString.IndexOf(" ");

        var number = Convert.ToInt32(ruleString.Substring(0, parts));


        rule.BagColour = ruleString.Replace(".", string.Empty)
                         .Replace("bags", string.Empty)
                         .Replace("bag", string.Empty)
                         .Trim()
                         .Substring(parts + 1);
        rule.NumberOfBags = number;

        return(rule);
    }
Exemple #23
0
        int HoldsBags(BagRule bagRule)
        {
            if (holdsBags.ContainsKey(bagRule.Name))
            {
                return(holdsBags[bagRule.Name]);
            }

            if (bagRule.Contains.Count == 0)
            {
                holdsBags[bagRule.Name] = 0;
                return(0);
            }
            else
            {
                var cnt = 0;
                foreach (var contains in bagRule.Contains)
                {
                    var targetBagRule = bagRules.FirstOrDefault(b => b.Name == contains.Item1);
                    cnt += (contains.Item2 + contains.Item2 * HoldsBags(targetBagRule));
                }
                holdsBags[bagRule.Name] = cnt;
                return(cnt);
            }
        }
Exemple #24
0
 public void Setup()
 {
     _bagRule = new BagRule(_input);
 }