Add Day 9
This commit is contained in:
@@ -19,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day7", "Day7\Day7.csproj",
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day8", "Day8\Day8.csproj", "{4D1D9998-BA7C-44F9-8305-DBB066485BAF}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day8", "Day8\Day8.csproj", "{4D1D9998-BA7C-44F9-8305-DBB066485BAF}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day9", "Day9\Day9.csproj", "{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -57,6 +59,10 @@ Global
|
|||||||
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4D1D9998-BA7C-44F9-8305-DBB066485BAF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
16
Day9/Day9.csproj
Normal file
16
Day9/Day9.csproj
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="input.txt">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
113
Day9/Program.cs
Normal file
113
Day9/Program.cs
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
var diskMap = File.ReadAllText("input.txt");
|
||||||
|
var disk = GenerateFileSystem(diskMap); // I could create a class for this, but... meh
|
||||||
|
var part1 = DefragBlocks(new List<int>(disk.Item1));
|
||||||
|
var part2 = DefragFiles(new List<int>(disk.Item1), new List<(int Id, int Length, int Position)>(disk.Item2), disk.Item3);
|
||||||
|
|
||||||
|
Console.WriteLine($"Part1: {part1}\nPart2: {part2}");
|
||||||
|
|
||||||
|
long DefragFiles(List<int> fileSystem, List<(int Id, int Length, int Position)> files, List<(int Length, int Position)> free)
|
||||||
|
{
|
||||||
|
for (var i = files.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
var file = files[i];
|
||||||
|
for (var j = 0; j < free.Count; j++)
|
||||||
|
{
|
||||||
|
var slot = free[j];
|
||||||
|
if (file.Position < slot.Position)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slot.Length >= file.Length)
|
||||||
|
{
|
||||||
|
for (var k = 0; k < file.Length; k++)
|
||||||
|
{
|
||||||
|
(fileSystem[slot.Position + k], fileSystem[file.Position + k]) = (fileSystem[file.Position + k], fileSystem[slot.Position + k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free[j] = (slot.Length - file.Length, slot.Position + file.Length);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CalculateChecksum(fileSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
long DefragBlocks(List<int> fileSystem)
|
||||||
|
{
|
||||||
|
(int left, int right) = (0, fileSystem.Count - 1);
|
||||||
|
while (left < right)
|
||||||
|
{
|
||||||
|
if (fileSystem[left] != -1)
|
||||||
|
{
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (fileSystem[right] == -1)
|
||||||
|
{
|
||||||
|
right--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(fileSystem[left], fileSystem[right]) = (fileSystem[right], fileSystem[left]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CalculateChecksum(fileSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
long CalculateChecksum(List<int> fileSystem)
|
||||||
|
{
|
||||||
|
var checksum = 0L;
|
||||||
|
for (var i = 0; i < fileSystem.Count; i++)
|
||||||
|
{
|
||||||
|
var value = fileSystem[i];
|
||||||
|
|
||||||
|
if (value != -1)
|
||||||
|
{
|
||||||
|
checksum += value * i;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
(List<int>, List<(int Id, int Length, int Position)>, List<(int Length, int Position)>) GenerateFileSystem(string diskMapDescription)
|
||||||
|
{
|
||||||
|
|
||||||
|
var file = true;
|
||||||
|
var fileSystem = new List<int>();
|
||||||
|
var freeSpace = new List<(int Length, int Position)>();
|
||||||
|
var files = new List<(int Id, int Length, int Position)>();
|
||||||
|
var id = 0;
|
||||||
|
|
||||||
|
foreach (var length in diskMapDescription.Select(c => int.Parse(c + "")))
|
||||||
|
{
|
||||||
|
var value = file ? id : -1;
|
||||||
|
var position = fileSystem.Count;
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
files.Add((id, length, position));
|
||||||
|
id += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
freeSpace.Add((length, position));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
fileSystem.Add(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
file = !file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (fileSystem, files, freeSpace);
|
||||||
|
}
|
||||||
1
Day9/input.txt
Normal file
1
Day9/input.txt
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user