Advertisement
mgla

Advent of Code 2022 - Day 14

Dec 14th, 2022 (edited)
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.13 KB | None | 0 0
  1. var input = await File.ReadAllLinesAsync("14.txt"));
  2.  
  3. Console.WriteLine($"Part 1: {Run(input, 1)}");
  4. Console.WriteLine($"Part 2: {Run(input, 2)}");
  5.  
  6. static int Run(IEnumerable<string> input, int part)
  7. {
  8.     var map = new HashSet<(int X, int Y)>();
  9.  
  10.     foreach (var line in input)
  11.     {
  12.         var pathPoints = line.Split(" -> ");
  13.  
  14.         for (var i = 0; i < pathPoints.Length - 1; i++)
  15.         {
  16.             var (from, to) = (
  17.                 pathPoints[i].Split(',').Select(int.Parse).ToArray(),
  18.                 pathPoints[i + 1].Split(',').Select(int.Parse).ToArray()
  19.             );
  20.  
  21.             var direction = from[0] == to[0] ? (X: 0, Y: Math.Sign(to[1] - from[1])) : (X: Math.Sign(to[0] - from[0]), Y: 0);
  22.  
  23.             while (from[0] != to[0] || from[1] != to[1])
  24.             {
  25.                 map.Add((from[0], from[1]));
  26.                 from[0] += direction.X;
  27.                 from[1] += direction.Y;
  28.             }
  29.             map.Add((from[0], from[1]));
  30.         }
  31.     }
  32.  
  33.     var sand = 0;
  34.  
  35.     var maxY = map.Max(s => s.Y);
  36.     var minX = map.Min(s => s.X);
  37.     var maxX = map.Max(s => s.X);
  38.  
  39.     if (part == 2)
  40.     {
  41.         maxY += 2;
  42.         for (var x = minX - maxY; x < maxX + maxY; x++) //make sure there's enough floor to catch the falling sand
  43.         {
  44.             map.Add((x, maxY));
  45.         }
  46.     }
  47.  
  48.     while (true)
  49.     {
  50.         var (sandX, sandY) = (500, 0);
  51.        
  52.         if (map.Contains((sandX, sandY))) { return sand; }
  53.  
  54.         while (true)
  55.         {
  56.             if (sandY == maxY) { return sand; }
  57.  
  58.             if (!map.Contains((sandX, sandY + 1)))
  59.             {
  60.                 sandY++;
  61.                 continue;
  62.             }
  63.            
  64.             if (!map.Contains((sandX - 1, sandY + 1)))
  65.             {
  66.                 sandX--;
  67.                 sandY++;
  68.                 continue;
  69.             }
  70.            
  71.             if (!map.Contains((sandX + 1, sandY + 1)))
  72.             {
  73.                 sandX++;
  74.                 sandY++;
  75.                 continue;
  76.             }
  77.  
  78.             break;
  79.         }
  80.  
  81.         map.Add((sandX, sandY));
  82.         sand++;
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement