コード例 #1
0
ファイル: Day12.cs プロジェクト: Greykoil/AdventOfCode_2019
 private static void AdjustVelocity(Moon moonOne, Moon moonTwo)
 {
     if (moonOne.XPosition > moonTwo.XPosition)
     {
         moonOne.XVelocity -= 1;
         moonTwo.XVelocity += 1;
     }
     else if (moonOne.XPosition < moonTwo.XPosition)
     {
         moonOne.XVelocity += 1;
         moonTwo.XVelocity -= 1;
     }
     if (moonOne.YPosition > moonTwo.YPosition)
     {
         moonOne.YVelocity -= 1;
         moonTwo.YVelocity += 1;
     }
     else if (moonOne.YPosition < moonTwo.YPosition)
     {
         moonOne.YVelocity += 1;
         moonTwo.YVelocity -= 1;
     }
     if (moonOne.ZPosition > moonTwo.ZPosition)
     {
         moonOne.ZVelocity -= 1;
         moonTwo.ZVelocity += 1;
     }
     else if (moonOne.ZPosition < moonTwo.ZPosition)
     {
         moonOne.ZVelocity += 1;
         moonTwo.ZVelocity -= 1;
     }
 }
コード例 #2
0
ファイル: Day12.cs プロジェクト: daemondeas/ideal-octo-system
        private static void ApplyGravity(Moon a, Moon b)
        {
            var(ax, bx) = GetGravityChanges(a.Position.X, b.Position.X);
            var(ay, by) = GetGravityChanges(a.Position.Y, b.Position.Y);
            var(az, bz) = GetGravityChanges(a.Position.Z, b.Position.Z);

            a.ChangeVelocity(ax, ay, az);
            b.ChangeVelocity(bx, by, bz);
        }
コード例 #3
0
        public void CalcVelocities(Moon moon)
        {
            var        x      = velocity.X;
            var        y      = velocity.Y;
            var        z      = velocity.Z;
            List <int> deltas = new List <int>();

            deltas.Add(this.location.X.CompareTo(moon.location.X));
            deltas.Add(this.location.Y.CompareTo(moon.location.Y));
            deltas.Add(this.location.Z.CompareTo(moon.location.Z));

            if (deltas[0] < 0)
            {
                x++;
            }
            else if (deltas[0] > 0)
            {
                x--;
            }

            if (deltas[1] < 0)
            {
                y++;
            }
            else if (deltas[1] > 0)
            {
                y--;
            }

            if (deltas[2] < 0)
            {
                z++;
            }
            else if (deltas[2] > 0)
            {
                z--;
            }

            SetVelocity(new Vector3D(x, y, z));
        }
コード例 #4
0
 public void AddMoon(Moon moon)
 {
     moons.Add(moon);
 }
コード例 #5
0
        private static void AoC12(string path)
        {
            const int steps = 1000;

            int count       = 1;
            int xConsonance = 0;
            int yConsonance = 0;
            int zConsonance = 0;

            Moon Io;
            Moon Europa;
            Moon Ganymede;
            Moon Callisto;

            Queue <Point3D> points = new Queue <Point3D>();

            using (StreamReader file = new StreamReader(path))
            {
                string line = string.Empty;

                while (!file.EndOfStream)
                {
                    line = file.ReadLine();
                    var split = line.Split('=', ',', '<', '>');
                    points.Enqueue(new Point3D(Double.Parse(split[2]), Double.Parse(split[4]), Double.Parse(split[6])));
                }
            }

            //init moons
            Io       = new Moon(points.Dequeue());
            Europa   = new Moon(points.Dequeue());
            Ganymede = new Moon(points.Dequeue());
            Callisto = new Moon(points.Dequeue());

            //part 2
            while (xConsonance == 0 || yConsonance == 0 || zConsonance == 0)
            {
                //apply gravity
                Io.CalcVelocities(Europa);
                Io.CalcVelocities(Ganymede);
                Io.CalcVelocities(Callisto);
                Europa.CalcVelocities(Io);
                Europa.CalcVelocities(Ganymede);
                Europa.CalcVelocities(Callisto);
                Ganymede.CalcVelocities(Europa);
                Ganymede.CalcVelocities(Io);
                Ganymede.CalcVelocities(Callisto);
                Callisto.CalcVelocities(Europa);
                Callisto.CalcVelocities(Ganymede);
                Callisto.CalcVelocities(Io);

                //time step
                Io.TimeStep();
                Europa.TimeStep();
                Ganymede.TimeStep();
                Callisto.TimeStep();

                if (xConsonance == 0)
                {
                    if (Io.GetVelocityByAxis("X") == 0 && Europa.GetVelocityByAxis("X") == 0 &&
                        Ganymede.GetVelocityByAxis("X") == 0 && Callisto.GetVelocityByAxis("X") == 0)
                    {
                        xConsonance = count;
                    }
                }
                if (yConsonance == 0)
                {
                    if (Io.GetVelocityByAxis("Y") == 0 && Europa.GetVelocityByAxis("Y") == 0 &&
                        Ganymede.GetVelocityByAxis("Y") == 0 && Callisto.GetVelocityByAxis("Y") == 0)
                    {
                        yConsonance = count;
                    }
                }
                if (zConsonance == 0)
                {
                    if (Io.GetVelocityByAxis("Z") == 0 && Europa.GetVelocityByAxis("Z") == 0 &&
                        Ganymede.GetVelocityByAxis("Z") == 0 && Callisto.GetVelocityByAxis("Z") == 0)
                    {
                        zConsonance = count;
                    }
                }

                count++;
            }

            long lcm = Functions.LCM(xConsonance, Functions.LCM(yConsonance, zConsonance)) * 2;

            Console.WriteLine(lcm);

            //part 1
            for (int i = 0; i < steps; i++)
            {
                //apply gravity
                Io.CalcVelocities(Europa);
                Io.CalcVelocities(Ganymede);
                Io.CalcVelocities(Callisto);
                Europa.CalcVelocities(Io);
                Europa.CalcVelocities(Ganymede);
                Europa.CalcVelocities(Callisto);
                Ganymede.CalcVelocities(Europa);
                Ganymede.CalcVelocities(Io);
                Ganymede.CalcVelocities(Callisto);
                Callisto.CalcVelocities(Europa);
                Callisto.CalcVelocities(Ganymede);
                Callisto.CalcVelocities(Io);

                //time step
                Io.TimeStep();
                Europa.TimeStep();
                Ganymede.TimeStep();
                Callisto.TimeStep();
            }

            var IoTotal   = Io.CalcPotentialEnergy() * Io.CalcKineticEnergy();
            var EurTotal  = Europa.CalcPotentialEnergy() * Europa.CalcKineticEnergy();
            var GanyTotal = Ganymede.CalcPotentialEnergy() * Ganymede.CalcKineticEnergy();
            var CallTotal = Callisto.CalcPotentialEnergy() * Callisto.CalcKineticEnergy();

            var TotalEnergy = IoTotal + EurTotal + GanyTotal + CallTotal;

            Console.WriteLine(TotalEnergy);
            Console.ReadKey();
        }