فهرست منبع

Day 3 solution for part 2

Lukas Angerer 2 سال پیش
والد
کامیت
8a048cae1c
2فایلهای تغییر یافته به همراه46 افزوده شده و 8 حذف شده
  1. 15 0
      Day3/Cell.cs
  2. 31 8
      Day3/Program.cs

+ 15 - 0
Day3/Cell.cs

@@ -0,0 +1,15 @@
+namespace Day3;
+
+public class Cell
+{
+    public SymbolToken Symbol { get; }
+    public IList<NumberToken> Numbers { get; }
+
+    public Cell(SymbolToken symbol)
+    {
+        Symbol = symbol;
+        Numbers = new List<NumberToken>();
+    }
+
+    public int GearRatio() => Numbers.Count == 2 ? Numbers.First().Value * Numbers.Last().Value : 0;
+}

+ 31 - 8
Day3/Program.cs

@@ -9,15 +9,23 @@ if (args.Length < 1)
 var inputFile = args[0];
 var inputFile = args[0];
 var parser = new SchematicParser();
 var parser = new SchematicParser();
 
 
-var set = new HashSet<Point2D>();
+var set = new Dictionary<Point2D, IList<Cell>>();
+var cellList = new List<Cell>();
 var tokens = parser.Parse(inputFile).ToList();
 var tokens = parser.Parse(inputFile).ToList();
 foreach (var token in tokens)
 foreach (var token in tokens)
 {
 {
     if (token is SymbolToken sym)
     if (token is SymbolToken sym)
     {
     {
+        var cell = new Cell(sym);
+        cellList.Add(cell);
         foreach (var p in sym.Position.SurroundingAndSelf())
         foreach (var p in sym.Position.SurroundingAndSelf())
         {
         {
-            set.Add(p);
+            if (!set.ContainsKey(p))
+            {
+                set[p] = new List<Cell>();
+            }
+            
+            set[p].Add(cell);
         }
         }
     }
     }
 }
 }
@@ -28,9 +36,10 @@ for (var y = 0; y < parser.Height; y++)
 {
 {
     for (var x = 0; x < parser.Width; x++)
     for (var x = 0; x < parser.Width; x++)
     {
     {
-        if (set.Contains(new Point2D(x, y)))
+        var p = new Point2D(x, y);
+        if (set.TryGetValue(p, out IList<Cell>? cells))
         {
         {
-            Console.Write("X");
+            Console.Write(cells.Count);
         }
         }
         else
         else
         {
         {
@@ -52,18 +61,32 @@ foreach (var token in tokens)
 Console.WriteLine();
 Console.WriteLine();
 Console.WriteLine($"Sum: {sum}");
 Console.WriteLine($"Sum: {sum}");
 
 
+sum = cellList.Select(c => c.GearRatio()).Sum();
+Console.WriteLine();
+Console.WriteLine($"Gear ratio sum: {sum}");
+
 return 0;
 return 0;
 
 
-int IsTouchingSymbol(ISet<Point2D> set, NumberToken num)
+int IsTouchingSymbol(Dictionary<Point2D, IList<Cell>> set, NumberToken num)
 {
 {
+    var touching = false;
+    var cellMap = new HashSet<Cell>();
     for (var w = 0; w < num.Length; w++)
     for (var w = 0; w < num.Length; w++)
     {
     {
         var p = num.Position with { X = num.Position.X + w };
         var p = num.Position with { X = num.Position.X + w };
-        if (set.Contains(p))
+        if (set.TryGetValue(p, out IList<Cell>? cells))
         {
         {
-            return num.Value;
+            touching = true;
+            foreach (var cell in cells)
+            {
+                if (!cellMap.Contains(cell))
+                {
+                    cell.Numbers.Add(num);
+                    cellMap.Add(cell);
+                }
+            }
         }
         }
     }
     }
 
 
-    return 0;
+    return touching ? num.Value : 0;
 }
 }