Add day 5
This commit is contained in:
@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day3", "Day3\Day3.csproj",
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day4", "Day4\Day4.csproj", "{739F3568-EE18-464B-8A60-281606EC2A31}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day5", "Day5\Day5.csproj", "{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -33,6 +35,10 @@ Global
|
||||
{739F3568-EE18-464B-8A60-281606EC2A31}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{739F3568-EE18-464B-8A60-281606EC2A31}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{739F3568-EE18-464B-8A60-281606EC2A31}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
16
Day5/Day5.csproj
Normal file
16
Day5/Day5.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>
|
||||
86
Day5/Program.cs
Normal file
86
Day5/Program.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
var lines = File.ReadAllLines("input.txt");
|
||||
|
||||
var pageOrderingRules = new List<(int, int)>();
|
||||
var pageNumbersUpdates = new List<List<int>>();
|
||||
|
||||
var separatorIndex = lines.ToList().IndexOf(string.Empty);
|
||||
for (var i = 0; i < separatorIndex; i++)
|
||||
{
|
||||
var parts = lines[i].Split('|');
|
||||
pageOrderingRules.Add((int.Parse(parts[0]), int.Parse(parts[1])));
|
||||
}
|
||||
|
||||
for (var i = separatorIndex + 1; i < lines.Length; i++)
|
||||
{
|
||||
var currentList = lines[i].Split(',')
|
||||
.Select(int.Parse)
|
||||
.ToList();
|
||||
pageNumbersUpdates.Add(currentList);
|
||||
}
|
||||
|
||||
var part1 = 0;
|
||||
var part2 = 0;
|
||||
|
||||
foreach (var pageNumberUpdate in pageNumbersUpdates)
|
||||
{
|
||||
var isInRightOder = true;
|
||||
|
||||
for (var i = 0; i < pageNumberUpdate.Count; i++)
|
||||
{
|
||||
var rules = pageOrderingRules
|
||||
.Where(rule => rule.Item1 == pageNumberUpdate[i])
|
||||
.ToList();
|
||||
|
||||
if (!IsPageInRightOrder(i, rules, pageNumberUpdate))
|
||||
{
|
||||
isInRightOder = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isInRightOder)
|
||||
{
|
||||
part1 += pageNumberUpdate[pageNumberUpdate.Count / 2];
|
||||
}
|
||||
else
|
||||
{
|
||||
var orderedPages = OrderPages(pageNumberUpdate, pageOrderingRules);
|
||||
part2 += orderedPages[orderedPages.Count / 2];
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"Part1: {part1}\nPart2: {part2}");
|
||||
|
||||
List<int> OrderPages( List<int> pageNumberUpdate, List<(int, int)> rules)
|
||||
{
|
||||
var orderedPages = new List<int>(pageNumberUpdate);
|
||||
bool changesMade;
|
||||
|
||||
do
|
||||
{
|
||||
changesMade = false;
|
||||
|
||||
foreach (var rule in rules)
|
||||
{
|
||||
if (!orderedPages.Contains(rule.Item1) || !orderedPages.Contains(rule.Item2)) continue;
|
||||
|
||||
var index1 = orderedPages.IndexOf(rule.Item1);
|
||||
var index2 = orderedPages.IndexOf(rule.Item2);
|
||||
|
||||
if (index1 <= index2) continue;
|
||||
|
||||
orderedPages.RemoveAt(index1);
|
||||
orderedPages.Insert(index2, rule.Item1);
|
||||
changesMade = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (changesMade);
|
||||
|
||||
return orderedPages;
|
||||
}
|
||||
|
||||
bool IsPageInRightOrder(int pageIndex, List<(int, int)> rules, List<int> pageNumberUpdate)
|
||||
{
|
||||
return rules.Select(rule => pageNumberUpdate.IndexOf(rule.Item2)).Where(indexOfRuleSecondPart => indexOfRuleSecondPart != -1).All(indexOfRuleSecondPart => pageIndex < indexOfRuleSecondPart);
|
||||
}
|
||||
1367
Day5/input.txt
Normal file
1367
Day5/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user