|
@@ -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;
|
|
|
}
|
|
}
|