public void Build(string[] orbits) { CenterOfMass = new OrbitingObject("COM", 0); CenterOfMass.OrbitingObjects.AddRange(GetOrbitingObjects(orbits, CenterOfMass.Name, 0)); OrbitChecksum += CenterOfMass.OrbitingObjects.Sum(o => o.OrbitLevel); }
private static OrbitingObject?FindOrbitingObject(OrbitingObject orbitingObject, string nameToFind) { OrbitingObject?result = null; if (orbitingObject.OrbitingObjects.Any(o => o.Name == nameToFind)) { result = orbitingObject; } else if (orbitingObject.OrbitingObjects.Count > 0) { result = orbitingObject.OrbitingObjects.Select(oo => FindOrbitingObject(oo, nameToFind)) .SingleOrDefault(oo => oo != null); } return(result); }
private IEnumerable <OrbitingObject> GetOrbitingObjects(string[] orbits, string name, int currentOrbitLevel) { var orbitingObjects = new List <OrbitingObject>(); // Need to add the ')' or C and COM both match and an infinite loop occurs. foreach (var orbit in orbits.Where(o => o.StartsWith($"{name})"))) { var orbitingObject = new OrbitingObject(orbit.Substring(orbit.IndexOf(')') + 1), currentOrbitLevel + 1); if (orbits.Any(o => o.StartsWith(orbitingObject.Name))) { orbitingObject.OrbitingObjects.AddRange( GetOrbitingObjects(orbits, orbitingObject.Name, currentOrbitLevel + 1)); } orbitingObjects.Add(orbitingObject); OrbitChecksum += orbitingObject.OrbitingObjects.Sum(o => o.OrbitLevel); } return(orbitingObjects); }