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); }
public void SetUp() { _solver = new Day10Solver(); _input = new Day10Input(); }
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()); }