public static void Dump(SpatialObject obj, Action <string> write, string level = "") { write($"{level}{obj.Name} - {obj.Color}"); foreach (var s in obj.Satellites) { Dump(s, write, level + "| "); } }
public static int CalculateDirectAndIndirectOrbits(SpatialObject obj) { int n = 0; while (obj.OrbitsAround != null) { n++; obj = obj.OrbitsAround; } return(n); }
public static IEnumerable <SpatialObject> GetPathToRootSpatialObject(SpatialObject obj) { obj = obj.OrbitsAround; while (obj != null) { yield return(obj); obj = obj.OrbitsAround; } }
public static SpatialObject ParseOne(string input) { var r = input.Split(')'); var n = new SpatialObject { Name = r[1], OrbitsAround = new SpatialObject { Name = r[0] } }; n.OrbitsAround.Satellites.Add(n); return(n); }
public (bool, int) CalculateOrbitalTransfersCount(SpatialObject from, SpatialObject to, Action <string> write) { foreach (var o in AllObjects.Values) { o.Color = 0; } var fromPath = GetPathToRootSpatialObject(from); var root = fromPath.Last(); foreach (var o in fromPath) { o.Color = 1; } Dump(root, write); var toPath = GetPathToRootSpatialObject(to); var tillIntersection1 = toPath.TakeWhile(x => x.Color == 0); if (tillIntersection1.Count() == 0) // Cas dégénéré, to déjà sur le chemin vers la racine depuis from { write("Cas dégénéré"); var tillIntersection2 = fromPath.TakeWhile(x => x != toPath.FirstOrDefault()); foreach (var o in tillIntersection2) { o.Color = 3; } Dump(root, write); return(true, tillIntersection2.Count()); } else { var intersection = tillIntersection1.Last().OrbitsAround.Color = 2; Dump(root, write); var tillIntersection2 = fromPath.TakeWhile(x => x.Color != 2); foreach (var o in tillIntersection2) { o.Color = 4; } Dump(root, write); return(false, tillIntersection1.Count() + tillIntersection2.Count()); } }