Program.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Day3;
  2. if (args.Length < 1)
  3. {
  4. Console.WriteLine("Requires 1 args: inputFileName");
  5. return -1;
  6. }
  7. var inputFile = args[0];
  8. var parser = new SchematicParser();
  9. var set = new Dictionary<Point2D, IList<Cell>>();
  10. var cellList = new List<Cell>();
  11. var tokens = parser.Parse(inputFile).ToList();
  12. foreach (var token in tokens)
  13. {
  14. if (token is SymbolToken sym)
  15. {
  16. var cell = new Cell(sym);
  17. cellList.Add(cell);
  18. foreach (var p in sym.Position.SurroundingAndSelf())
  19. {
  20. if (!set.ContainsKey(p))
  21. {
  22. set[p] = new List<Cell>();
  23. }
  24. set[p].Add(cell);
  25. }
  26. }
  27. }
  28. Console.WriteLine();
  29. for (var y = 0; y < parser.Height; y++)
  30. {
  31. for (var x = 0; x < parser.Width; x++)
  32. {
  33. var p = new Point2D(x, y);
  34. if (set.TryGetValue(p, out IList<Cell>? cells))
  35. {
  36. Console.Write(cells.Count);
  37. }
  38. else
  39. {
  40. Console.Write("-");
  41. }
  42. }
  43. Console.WriteLine("|");
  44. }
  45. var sum = 0;
  46. foreach (var token in tokens)
  47. {
  48. if (token is NumberToken num)
  49. {
  50. sum += IsTouchingSymbol(set, num);
  51. }
  52. }
  53. Console.WriteLine();
  54. Console.WriteLine($"Sum: {sum}");
  55. sum = cellList.Select(c => c.GearRatio()).Sum();
  56. Console.WriteLine();
  57. Console.WriteLine($"Gear ratio sum: {sum}");
  58. return 0;
  59. int IsTouchingSymbol(Dictionary<Point2D, IList<Cell>> set, NumberToken num)
  60. {
  61. var touching = false;
  62. var cellMap = new HashSet<Cell>();
  63. for (var w = 0; w < num.Length; w++)
  64. {
  65. var p = num.Position with { X = num.Position.X + w };
  66. if (set.TryGetValue(p, out IList<Cell>? cells))
  67. {
  68. touching = true;
  69. foreach (var cell in cells)
  70. {
  71. if (!cellMap.Contains(cell))
  72. {
  73. cell.Numbers.Add(num);
  74. cellMap.Add(cell);
  75. }
  76. }
  77. }
  78. }
  79. return touching ? num.Value : 0;
  80. }