static void Main(string[] args) { var lines = File.ReadAllLines(".\\input.txt"); Regex outerBagPattern = new Regex("[a-z ]*(?= bags contain)"); Regex innerBagPattern = new Regex(@"(?<count>\d+) (?<color>[a-z ]+)(?= bags?[,\.])"); var bagDict = new Dictionary <string, BagNode>(); foreach (string line in lines) { string containerName = outerBagPattern.Match(line).Value; var containedBags = innerBagPattern.Matches(line).OfType <Match>().Select(m => BagNode.GetLink(int.Parse(m.Groups["count"].Value), m.Groups["color"].Value)); BagNode.AddNode(containerName, containedBags); } BagNode.SetReverseLinks(); BagNode start = BagNode.AllBags["shiny gold"]; // Part one Console.WriteLine(GetContainers(start).Distinct().Count()); // Part two Console.WriteLine(GetContainedCount(start)); Console.Read(); }