Пример #1
0
        public static void PartOne()
        {
            string input = InputHelper.GetInputFromFile("6");

            IEnumerable <(string Orbitee, string Orbiter)> orbits = input.Split("\r\n").Select(line => { var parts = line.Split(")"); return(parts[0], parts[1]); });

            OrbitTree         tree = new OrbitTree();
            Queue <Orbitable> orbitablesToProcess = new Queue <Orbitable>();

            orbitablesToProcess.Enqueue(tree.CenterOfMass);
            while (orbitablesToProcess.Count() > 0)
            {
                Orbitable currentOrbitable = orbitablesToProcess.Dequeue();
                var       orbiters         = orbits.Where(o => o.Orbitee == currentOrbitable.Code).Select(o => o.Orbiter);
                foreach (string orbiterCode in orbiters)
                {
                    Orbitable orbitable = new Orbitable(orbiterCode, currentOrbitable);
                    currentOrbitable.Orbiters.Add(orbitable);
                    orbitablesToProcess.Enqueue(orbitable);
                }
            }

            //Display(tree.CenterOfMass);
            Console.WriteLine($"Weight : {Weight(tree.CenterOfMass)}");
        }
Пример #2
0
        private static int GetDistanceBetween(OrbitTree tree, Orbitable me, Orbitable santa)
        {
            int       distanceUp = 0;
            Orbitable link       = me.Orbitee;
            IEnumerable <Orbitable> reachables = Flatten(link);

            while (!reachables.Contains(santa))
            {
                link       = link.Orbitee;
                reachables = Flatten(link);
                distanceUp++;
            }
            return(distanceUp + DistanceDownTo(link, santa));
        }
Пример #3
0
        public static void PartTwo()
        {
            string input = InputHelper.GetInputFromFile("6");

            IEnumerable <(string Orbitee, string Orbiter)> orbits = input.Split("\r\n").Select(line => { var parts = line.Split(")"); return(parts[0], parts[1]); });

            OrbitTree         tree = new OrbitTree();
            Queue <Orbitable> orbitablesToProcess = new Queue <Orbitable>();

            orbitablesToProcess.Enqueue(tree.CenterOfMass);
            Orbitable me = null, santa = null;

            while (orbitablesToProcess.Count() > 0)
            {
                Orbitable currentOrbitable = orbitablesToProcess.Dequeue();
                var       orbiters         = orbits.Where(o => o.Orbitee == currentOrbitable.Code).Select(o => o.Orbiter);
                foreach (string orbiterCode in orbiters)
                {
                    Orbitable orbitable = new Orbitable(orbiterCode, currentOrbitable);
                    if (orbiterCode == "YOU")
                    {
                        me = orbitable;
                    }
                    if (orbiterCode == "SAN")
                    {
                        santa = orbitable;
                    }
                    currentOrbitable.Orbiters.Add(orbitable);
                    orbitablesToProcess.Enqueue(orbitable);
                }
            }

            //Display(tree.CenterOfMass);
            int distanceBetween = GetDistanceBetween(tree, me, santa);

            Console.WriteLine($"Distance: {distanceBetween}");
        }