mgla

Advent of Code - 2024 - Day 9

Dec 9th, 2024 (edited)
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.00 KB | None | 0 0
  1. var input = await File.ReadAllTextAsync("input.txt");
  2.  
  3. var decompressed = new List<int>();
  4. var filesReversed = new List<(int Id, int Index, int Length)>();
  5. var freeBlocks = new List<(int Index, int Length)>();
  6.  
  7. for (var i = 1; i <= input.Length; i += 2)
  8. {
  9.     var fileLength = int.Parse(input[i - 1].ToString());
  10.     if (fileLength > 0)
  11.     {
  12.         filesReversed.Insert(0, (i / 2, decompressed.Count, fileLength));
  13.     }
  14.  
  15.     var freeSpace = i == input.Length ? 0 : int.Parse(input[i].ToString());
  16.     if (freeSpace > 0)
  17.     {
  18.         freeBlocks.Add((decompressed.Count + fileLength, freeSpace));
  19.     }
  20.  
  21.     decompressed.AddRange(Enumerable.Repeat(i / 2, fileLength));
  22.     decompressed.AddRange(Enumerable.Repeat(-1, freeSpace));
  23. }
  24.  
  25. List<int> compressed = [..decompressed];
  26.  
  27. for (var i = compressed.Count - 1; i > 0; i--)
  28. {
  29.     var block = compressed[i];
  30.     if (block == -1)
  31.     {
  32.         continue;
  33.     }
  34.  
  35.     var freeBlock = compressed.IndexOf(-1);
  36.     if (freeBlock >= i)
  37.     {
  38.         break;
  39.     }
  40.  
  41.     compressed[freeBlock] = block;
  42.     compressed[i] = -1;
  43. }
  44.  
  45. var part1 = compressed.Select((c, i) => c == -1 ? 0L : c * i).Sum();
  46.  
  47. Console.WriteLine($"Part 1: {part1}");
  48.  
  49. compressed = [..decompressed];
  50.  
  51. foreach (var file in filesReversed)
  52. {
  53.     var freeSpace = freeBlocks.FirstOrDefault(f => f.Index < file.Index && f.Length >= file.Length);
  54.     if (freeSpace == default)
  55.     {
  56.         continue;
  57.     }
  58.  
  59.     for (var j = 0; j < file.Length; j++)
  60.     {
  61.         compressed[freeSpace.Index + j] = file.Id;
  62.         compressed[file.Index + j] = -1;
  63.     }
  64.  
  65.     if (freeSpace.Length == file.Length)
  66.     {
  67.         freeBlocks.Remove(freeSpace);
  68.     }
  69.     else
  70.     {
  71.         freeBlocks[freeBlocks.IndexOf(freeSpace)] = (freeSpace.Index + file.Length, freeSpace.Length - file.Length);
  72.     }
  73.  
  74.     if (freeBlocks[0].Index > file.Index)
  75.     {
  76.         break;
  77.     }
  78. }
  79.  
  80. var part2 = compressed.Select((c, i) => c == -1 ? 0L : c * i).Sum();
  81.  
  82. Console.WriteLine($"Part 2: {part2}");
Advertisement
Add Comment
Please, Sign In to add comment