Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6.  
  7. namespace aoc2018
  8. {
  9. public class Day6
  10. {
  11. class Point
  12. {
  13. public int X, Y, Index, Dist;
  14. public char Char => (char) ('A' + Index);
  15.  
  16. public static int Counter = 0;
  17.  
  18. public Point(int _x, int _y)
  19. {
  20. X = _x;
  21. Y = _y;
  22. Index = Counter++;
  23. }
  24.  
  25. public Point(int x1, int y1, int x2, int y2, int index)
  26. {
  27. Dist = Math.Abs(x1 - x2) + Math.Abs(y1 - y2);
  28. Index = index;
  29. }
  30.  
  31. public Point(int index, int dist, bool notUsed)
  32. {
  33. Index = index;
  34. Dist = dist;
  35. }
  36. }
  37.  
  38. public void Run()
  39. {
  40. var sw = Stopwatch.StartNew();
  41. // Part 1
  42. var s1 = Part1(1);
  43. var s2 = Part1(2);
  44. s2.RemoveAll(p2 => p2.Dist != s1.Single(p1 => p1.Char == p2.Char).Dist);
  45. sw.Stop();
  46. Console.WriteLine($"{s2.Max(x => x.Dist)} in {sw.ElapsedMilliseconds}ms");
  47.  
  48. // Part 2
  49. Console.WriteLine(Part2(10000));
  50. }
  51.  
  52. IEnumerable<Point> GetDistanceTo(IEnumerable<Point> points, int x, int y)
  53. {
  54. foreach (var p in points)
  55. {
  56. yield return new Point(p.X, p.Y, x, y, p.Index);
  57. }
  58. }
  59.  
  60. List<Point> GetPoints(int margin)
  61. {
  62. Point.Counter = 0;
  63.  
  64. return File.ReadAllLines("input\\day6input.txt")
  65. .Select(p => p.Split(new[] { ", " }, 2, StringSplitOptions.RemoveEmptyEntries))
  66. .Select(p => (int.Parse(p[0]), int.Parse(p[1])))
  67. .Select(p => new Point(margin + p.Item1, margin + p.Item2))
  68. .ToList();
  69. }
  70.  
  71. List<Point> Part1(int margin)
  72. {
  73. var points = GetPoints(margin);
  74. var matrix = new char?[margin + points.Max(x => x.Y), margin + points.Max(x => x.X)];
  75. points.ForEach(x => matrix[x.Y, x.X] = x.Char);
  76.  
  77. Fill();
  78.  
  79. return points.Select(x => new Point(x.Index, Count(x), true)).ToList();
  80.  
  81. int Count(Point p)
  82. {
  83. var r = 0;
  84. for (var i = 0; i < matrix.GetLength(0); i++)
  85. {
  86. for (var j = 0; j < matrix.GetLength(1); j++)
  87. {
  88. if (matrix[i, j].GetValueOrDefault('.') == p.Char)
  89. {
  90. r++;
  91. }
  92. }
  93. }
  94. return r;
  95. }
  96.  
  97. void Fill()
  98. {
  99. for (var i = 0; i < matrix.GetLength(0); i++)
  100. {
  101. for (var j = 0; j < matrix.GetLength(1); j++)
  102. {
  103. if (matrix[i, j].HasValue)
  104. {
  105. continue;
  106. }
  107.  
  108. var dist = GetDistanceTo(points, j, i).OrderBy(x => x.Dist).ToList();
  109. var min = dist.First();
  110. matrix[i, j] = dist.Count(x => x.Dist == min.Dist) == 1 ? min.Char : '.';
  111. }
  112. }
  113. }
  114. }
  115.  
  116. int Part2(int threshold)
  117. {
  118. var points = this.GetPoints(0);
  119. var r = 0;
  120.  
  121. for (var i = 0; i < points.Max(x => x.Y); i++)
  122. {
  123. for (var j = 0; j < points.Max(x => x.X); j++)
  124. {
  125. if (GetDistanceTo(points, j, i).Sum(x => x.Dist) < threshold)
  126. {
  127. r++;
  128. }
  129. }
  130. }
  131. return r;
  132. }
  133. }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement