Add day 5
This commit is contained in:
@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day3", "Day3\Day3.csproj",
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day4", "Day4\Day4.csproj", "{739F3568-EE18-464B-8A60-281606EC2A31}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day4", "Day4\Day4.csproj", "{739F3568-EE18-464B-8A60-281606EC2A31}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day5", "Day5\Day5.csproj", "{F6C4FEFC-795A-45A5-A227-3DCA06749BAD}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
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}.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.ActiveCfg = Release|Any CPU
|
||||||
{739F3568-EE18-464B-8A60-281606EC2A31}.Release|Any CPU.Build.0 = 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
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
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