|
@@ -0,0 +1,63 @@
|
|
|
|
|
+using System.Collections.ObjectModel;
|
|
|
|
|
+
|
|
|
|
|
+using Day10;
|
|
|
|
|
+
|
|
|
|
|
+namespace Day11;
|
|
|
|
|
+
|
|
|
|
|
+public class Universe
|
|
|
|
|
+{
|
|
|
|
|
+ public IList<Galaxy> Galaxies { get; } = new List<Galaxy>();
|
|
|
|
|
+
|
|
|
|
|
+ public void Add(Galaxy galaxy)
|
|
|
|
|
+ {
|
|
|
|
|
+ Galaxies.Add(galaxy);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void Expand()
|
|
|
|
|
+ {
|
|
|
|
|
+ var xMap = new Dictionary<int, IList<Galaxy>>();
|
|
|
|
|
+ var yMap = new Dictionary<int, IList<Galaxy>>();
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var g in Galaxies)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!xMap.ContainsKey(g.Position.X))
|
|
|
|
|
+ {
|
|
|
|
|
+ xMap.Add(g.Position.X, new List<Galaxy>());
|
|
|
|
|
+ }
|
|
|
|
|
+ xMap[g.Position.X].Add(g);
|
|
|
|
|
+ if (!yMap.ContainsKey(g.Position.Y))
|
|
|
|
|
+ {
|
|
|
|
|
+ yMap.Add(g.Position.Y, new List<Galaxy>());
|
|
|
|
|
+ }
|
|
|
|
|
+ yMap[g.Position.Y].Add(g);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var xPrev = -1;
|
|
|
|
|
+ var xExpand = 0;
|
|
|
|
|
+ foreach (var x in xMap.Keys.Order())
|
|
|
|
|
+ {
|
|
|
|
|
+ xExpand += x - xPrev - 1;
|
|
|
|
|
+ xPrev = x;
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var g in xMap[x])
|
|
|
|
|
+ {
|
|
|
|
|
+ var delta = new GridPoint(xExpand, 0);
|
|
|
|
|
+ g.Move(delta);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var yPrev = -1;
|
|
|
|
|
+ var yExpand = 0;
|
|
|
|
|
+ foreach (var y in yMap.Keys.Order())
|
|
|
|
|
+ {
|
|
|
|
|
+ yExpand += y - yPrev - 1;
|
|
|
|
|
+ yPrev = y;
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var g in yMap[y])
|
|
|
|
|
+ {
|
|
|
|
|
+ var delta = new GridPoint(0, yExpand);
|
|
|
|
|
+ g.Move(delta);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|