Advertisement
mgla

Advent of Code 2023 - Day 14

Dec 13th, 2023 (edited)
843
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.58 KB | None | 0 0
  1. var input = File.ReadAllLines("input.txt").Select(s => s.ToCharArray()).ToArray();
  2.  
  3. TiltNorth();
  4.  
  5. var part1 = 0;
  6.  
  7. for (var score = input.Length; score > 0; score--)
  8. {
  9.     part1 += input[^score].Count(c => c == 'O') * score;
  10. }
  11.  
  12. Console.WriteLine($"Part 1: {part1}");
  13.  
  14. var cache = new Dictionary<string, int>();
  15. var cycle = 1;
  16.  
  17. while (cycle <= 1_000_000_000)
  18. {
  19.     TiltNorth();
  20.     TiltWest();
  21.     TiltSouth();
  22.     TiltEast();
  23.  
  24.     var current = string.Join(string.Empty, input.SelectMany(c => c));
  25.  
  26.     if (cache.TryGetValue(current, out var cached))
  27.     {
  28.         var remaining = 1_000_000_000 - cycle - 1;
  29.         var loop = cycle - cached;
  30.  
  31.         var loopRemaining = remaining % loop;
  32.         cycle = 1_000_000_000 - loopRemaining - 1;
  33.     }
  34.  
  35.     cache[current] = cycle++;
  36. }
  37.  
  38. var part2 = 0;
  39.  
  40. for (var score = input.Length; score > 0; score--)
  41. {
  42.     part2 += input[^score].Count(c => c == 'O') * score;
  43. }
  44.  
  45. Console.WriteLine($"Part 2: {part2}");
  46. return;
  47.  
  48. void TiltNorth()
  49. {
  50.     for (var row = 1; row < input.Length; row++)
  51.     {
  52.         for (var col = 0; col < input[row].Length; col++)
  53.         {
  54.             var c = input[row][col];
  55.  
  56.             if (c != 'O')
  57.             {
  58.                 continue;
  59.             }
  60.  
  61.             var previous = 1;
  62.             while (input[row - previous][col] == '.')
  63.             {
  64.                 input[row - previous][col] = 'O';
  65.                 input[row - previous + 1][col] = '.';
  66.                 previous++;
  67.  
  68.                 if (row - previous < 0)
  69.                 {
  70.                     break;
  71.                 }
  72.             }
  73.         }
  74.     }
  75. }
  76.  
  77. void TiltSouth()
  78. {
  79.     for (var row = input.Length - 2; row >= 0; row--)
  80.     {
  81.         for (var col = 0; col < input[row].Length; col++)
  82.         {
  83.             var c = input[row][col];
  84.  
  85.             if (c != 'O')
  86.             {
  87.                 continue;
  88.             }
  89.  
  90.             var previous = 1;
  91.             while (input[row + previous][col] == '.')
  92.             {
  93.                 input[row + previous][col] = 'O';
  94.                 input[row + previous - 1][col] = '.';
  95.                 previous++;
  96.  
  97.                 if (row + previous >= input.Length)
  98.                 {
  99.                     break;
  100.                 }
  101.             }
  102.         }
  103.     }
  104. }
  105.  
  106. void TiltWest()
  107. {
  108.     for (var row = 0; row < input.Length; row++)
  109.     {
  110.         for (var col = 1; col < input[row].Length; col++)
  111.         {
  112.             var c = input[row][col];
  113.  
  114.             if (c != 'O')
  115.             {
  116.                 continue;
  117.             }
  118.  
  119.             var previous = 1;
  120.             while (input[row][col - previous] == '.')
  121.             {
  122.                 input[row][col - previous] = 'O';
  123.                 input[row][col - previous + 1] = '.';
  124.                 previous++;
  125.  
  126.                 if (col - previous < 0)
  127.                 {
  128.                     break;
  129.                 }
  130.             }
  131.         }
  132.     }
  133. }
  134.  
  135. void TiltEast()
  136. {
  137.     for (var row = 0; row < input.Length; row++)
  138.     {
  139.         for (var col = input[row].Length - 2; col >= 0; col--)
  140.         {
  141.             var c = input[row][col];
  142.  
  143.             if (c != 'O')
  144.             {
  145.                 continue;
  146.             }
  147.  
  148.             var previous = 1;
  149.             while (input[row][col + previous] == '.')
  150.             {
  151.                 input[row][col + previous] = 'O';
  152.                 input[row][col + previous - 1] = '.';
  153.                 previous++;
  154.  
  155.                 if (col + previous >= input[row].Length)
  156.                 {
  157.                     break;
  158.                 }
  159.             }
  160.         }
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement