Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var input = await File.ReadAllTextAsync("input.txt");
- var decompressed = new List<int>();
- var filesReversed = new List<(int Id, int Index, int Length)>();
- var freeBlocks = new List<(int Index, int Length)>();
- for (var i = 1; i <= input.Length; i += 2)
- {
- var fileLength = int.Parse(input[i - 1].ToString());
- if (fileLength > 0)
- {
- filesReversed.Insert(0, (i / 2, decompressed.Count, fileLength));
- }
- var freeSpace = i == input.Length ? 0 : int.Parse(input[i].ToString());
- if (freeSpace > 0)
- {
- freeBlocks.Add((decompressed.Count + fileLength, freeSpace));
- }
- decompressed.AddRange(Enumerable.Repeat(i / 2, fileLength));
- decompressed.AddRange(Enumerable.Repeat(-1, freeSpace));
- }
- List<int> compressed = [..decompressed];
- for (var i = compressed.Count - 1; i > 0; i--)
- {
- var block = compressed[i];
- if (block == -1)
- {
- continue;
- }
- var freeBlock = compressed.IndexOf(-1);
- if (freeBlock >= i)
- {
- break;
- }
- compressed[freeBlock] = block;
- compressed[i] = -1;
- }
- var part1 = compressed.Select((c, i) => c == -1 ? 0L : c * i).Sum();
- Console.WriteLine($"Part 1: {part1}");
- compressed = [..decompressed];
- foreach (var file in filesReversed)
- {
- var freeSpace = freeBlocks.FirstOrDefault(f => f.Index < file.Index && f.Length >= file.Length);
- if (freeSpace == default)
- {
- continue;
- }
- for (var j = 0; j < file.Length; j++)
- {
- compressed[freeSpace.Index + j] = file.Id;
- compressed[file.Index + j] = -1;
- }
- if (freeSpace.Length == file.Length)
- {
- freeBlocks.Remove(freeSpace);
- }
- else
- {
- freeBlocks[freeBlocks.IndexOf(freeSpace)] = (freeSpace.Index + file.Length, freeSpace.Length - file.Length);
- }
- if (freeBlocks[0].Index > file.Index)
- {
- break;
- }
- }
- var part2 = compressed.Select((c, i) => c == -1 ? 0L : c * i).Sum();
- Console.WriteLine($"Part 2: {part2}");
Advertisement
Add Comment
Please, Sign In to add comment