private static void SetIncorrectTower(TowerProgram tower) { var rootChildSums = new List <int>(); foreach (var child in tower.Children) { _sum = 0; AddChildSums(child); rootChildSums.Add(_sum + child.Weight); } var grouped = rootChildSums.GroupBy(weight => weight); if (grouped.Count() > 1) { var odd = grouped.First(x => x.Count() == 1); var index = rootChildSums.IndexOf(odd.Key); var foundOdd = tower.Children[index]; var rest = grouped.First(x => x.Count() > 1); _difference = odd.Key - rest.Key; SetIncorrectTower(foundOdd); } else { _incorrectTower = tower; } }
private static void AddChildSums(TowerProgram tower) { _sum += tower.Children.Sum(x => x.Weight); foreach (var child in tower.Children) { AddChildSums(child); } }
private static List <TowerProgram> GetTowers(string[] data) { var towers = new List <TowerProgram>(); var tempChildren = new List <string[]>(); foreach (var line in data) { var nameEnd = line.IndexOf(' '); var name = line.Substring(0, nameEnd); var weightStart = line.IndexOf('(') + 1; var length = line.IndexOf(')') - weightStart; var weight = line.Substring(weightStart, length); var childrenStart = line.IndexOf("->"); if (childrenStart != -1) { tempChildren.Add(line.Substring(childrenStart + 3) .Replace(",", "") .Split(' ')); } else { tempChildren.Add(new string[0]); } var tower = new TowerProgram() { Name = name, Weight = int.Parse(weight), Children = new List <TowerProgram>() }; towers.Add(tower); } for (int i = 0; i < tempChildren.Count; i++) { foreach (var name in tempChildren[i]) { var result = towers.FirstOrDefault(x => x.Name == name); towers[i].Children.Add(result); } } return(towers); }