示例#1
0
 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 + "|  ");
     }
 }
示例#2
0
        public static int CalculateDirectAndIndirectOrbits(SpatialObject obj)
        {
            int n = 0;

            while (obj.OrbitsAround != null)
            {
                n++; obj = obj.OrbitsAround;
            }
            return(n);
        }
示例#3
0
        public static IEnumerable <SpatialObject> GetPathToRootSpatialObject(SpatialObject obj)
        {
            obj = obj.OrbitsAround;
            while (obj != null)
            {
                yield return(obj);

                obj = obj.OrbitsAround;
            }
        }
示例#4
0
        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);
        }
示例#5
0
        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());
            }
        }