Exemplo n.º 1
0
        public int Star2(Day10Input input)
        {
            var observatory = Star1(input);

            var maxX = (int)observatory.Space.Max(c => c.Position.X);

            var pt1 = observatory.Location;
            var pt3 = new Point(pt1.X + maxX + 100, pt1.Y);

            var positions = new List <SpaceUnitAngle>();

            foreach (var spaceUnit in observatory.Space.GetFlat().Where(c => c.IsVisible))
            {
                var sup   = spaceUnit.Position;
                var pt2   = new Point(Math.Abs(sup.X), Math.Abs(sup.Y));
                var angle = GetAngle(pt1, pt2, pt3);
                var quad  = -1;

                if (sup.X >= pt1.X && sup.Y < pt1.Y)
                {
                    quad = 0;
                }
                else if (sup.X > pt1.X && sup.Y >= pt1.Y)
                {
                    quad  = 1;
                    angle = -angle;
                }
                else if (sup.X <= pt1.X && sup.Y > pt1.Y)
                {
                    quad  = 2;
                    angle = -angle;
                }
                else if (sup.X <= pt1.X && sup.Y <= pt1.Y)
                {
                    quad = 3;
                }
                else
                {
                    throw new Exception("Missing param");
                }

                positions.Add(new SpaceUnitAngle
                {
                    SpaceUnit = spaceUnit,
                    Angle     = angle,
                    Quadrant  = quad
                });
            }

            positions = positions.OrderBy(c => c.Quadrant)
                        .ThenByDescending(c => c.Angle)
                        .ToList();

            var p199 = positions[199];

            return(p199.SpaceUnit.Position.X * 100 + p199.SpaceUnit.Position.Y);
        }
Exemplo n.º 2
0
 public void SetUp()
 {
     _solver = new Day10Solver();
     _input  = new Day10Input();
 }
Exemplo n.º 3
0
        public Observatory Star1(Day10Input input)
        {
            var observatories = new List <Observatory>();

            for (var i = 0; i < input.Space.Rows; i++)
            {
                for (var j = 0; j < input.Space.Columns; j++)
                {
                    var inputClone = (Day10Input)input.Clone();
                    var space      = inputClone.Space;
                    var me         = space[i, j];
                    if (!me.ContainsAsteroid)
                    {
                        continue;
                    }

                    var currentRange = 1;
                    while (true)
                    {
                        var region = space.GetRectFillInvalid(Region.FromCenter(i, j, currentRange, currentRange));

                        for (var i1 = 0; i1 < region.Rows; i1++)
                        {
                            for (var j1 = 0; j1 < region.Columns; j1++)
                            {
                                var objective = region[i1, j1];

                                if (objective.Position == new Point(-1, -1))
                                {
                                    continue;
                                }
                                if (objective.Position.Y == i && objective.Position.X == j)
                                {
                                    continue;                     // self
                                }
                                if (!objective.ContainsAsteroid)
                                {
                                    continue;
                                }

                                var vector = new Point(objective.Position.X - me.Position.X, objective.Position.Y - me.Position.Y);

                                var lcm = LCM(vector.X, vector.Y);
                                if (lcm is {} lcmV)
                                {
                                    vector = new Point(vector.X / lcmV, vector.Y / lcmV);
                                }


                                if (vector.X == 0)
                                {
                                    vector.Y = vector.Y < 0 ? -1 : 1;
                                }

                                if (vector.Y == 0)
                                {
                                    vector.X = vector.X < 0 ? -1 : 1;
                                }


                                var relPoint = objective.Position;
                                while (true)
                                {
                                    relPoint = new Point(relPoint.X + vector.X, relPoint.Y + vector.Y);

                                    if (relPoint.X < 0 || relPoint.X >= input.Space.Columns ||
                                        relPoint.Y < 0 || relPoint.Y >= input.Space.Rows)
                                    {
                                        break;
                                    }

                                    space[relPoint.Y, relPoint.X].Shadowed = true;
                                }
                            }
                        }

                        currentRange += 2;
                        if (currentRange / 2 > input.Space.Rows && currentRange / 2 > input.Space.Columns)
                        {
                            break;
                        }
                    }

                    var observatory = new Observatory
                    {
                        Space    = space,
                        Location = new Point(j, i),
                        TotalVisibleAsteroids = space.GetFlat().Count(c => c.IsVisible) - 1
                    };
                    observatories.Add(observatory);
                }
            }

            return(observatories.OrderByDescending(c => c.TotalVisibleAsteroids).First());
        }