public static List <LuggageDescription> Search(int quantity, string color, List <LuggageDescription> luggageDescriptions) { var result = new List <LuggageDescription>(); foreach (var container in luggageDescriptions) { if (container.Color == color) { var luggage = new LuggageDescription(quantity, container.Color); foreach (var containee in container.Contains) { var contains = Search(containee.Quantity, containee.Color, luggageDescriptions); foreach (var contain in contains) { luggage.Contains.Add(contain); } } result.Add(luggage); } } return(result); }
public static int RecursiveCount(LuggageDescription luggage) { int sum = 0; foreach (var containee in luggage.Contains) { sum += containee.Quantity + (containee.Quantity * RecursiveCount(containee)); } return(sum); }
internal static List <LuggageDescription> Parse(string filename) { var result = new List <LuggageDescription>(); var containRegex = new Regex(@"^(?<container>.*) bags contain (?<containees>.*)\.$"); var containeesRegex = new Regex(@"(?<number>\d*) (?<description>.+) bag"); foreach (var line in File.ReadAllLines(filename)) { var containResult = containRegex.Match(line); var luggage = new LuggageDescription(1, containResult.Groups["container"].Value); var containees = containResult.Groups["containees"].Value; if (containees == "no other bags") { result.Add(luggage); continue; } var parts = containees.Split(", "); foreach (var part in parts) { var containeeResult = containeesRegex.Match(part); var containeeNumber = int.Parse(containeeResult.Groups["number"].Value); var containeeDescription = containeeResult.Groups["description"].Value; var containee = new LuggageDescription(containeeNumber, containeeDescription); luggage.Contains.Add(containee); } result.Add(luggage); } return(result); }