This commit is contained in:
2024-12-05 20:56:04 -05:00
parent 9f7096e6bb
commit 33baab170f
2 changed files with 173 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Rule = (int after, int before);
namespace AdventOfCode.Problems.AOC2024.Day5;
internal class PageList
{
private readonly List<Rule> _rules;
private PageNode _root;
public PageList(int[] pages, List<Rule> rules)
{
_rules = rules.Where(r => pages.Contains(r.before)).ToList();
_root = new PageNode(pages[0], GetRulesForPage(pages[0]));
for (int i = 1; i < pages.Length; i++)
AddPage(pages[i]);
}
public void AddPage(int page)
{
var node = new PageNode(page, GetRulesForPage(page));
if(node.IsBefore(_root))
{
node.NextNode = _root;
_root = node;
return;
}
var curNode = _root;
while(curNode != null)
{
if(curNode.IsBefore(node))
{
if(curNode.NextNode == null)
{
curNode.NextNode = node;
break;
}
else if(node.IsBefore(curNode.NextNode))
{
node.NextNode = curNode.NextNode;
curNode.NextNode = node;
break;
}
}
curNode = curNode.NextNode;
}
}
public List<Rule> GetRulesForPage(int page)
{
return _rules.Where(r => r.after == page).ToList();
}
public List<int> Traverse()
{
var list = new List<int>();
var curNode = _root;
while(curNode != null)
{
list.Add(curNode.Page);
curNode = curNode.NextNode;
}
return list;
}
}
internal class PageNode
{
public int Page { get; set; }
public int[] Before { get; set; }
public PageNode? NextNode { get; set; }
public PageNode(int page, List<Rule> rules)
{
Page = page;
Before = rules.Count == 0 ? [int.MinValue] : rules.Select(r => r.before).ToArray();
}
public override string ToString()
{
return $"{Page} << {Before}";
}
public bool IsBefore(PageNode other)
{
if(Before.Any(b => b == other.Page))
return true;
return false;
}
}

View File

@@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Rule = (int after, int before);
namespace AdventOfCode.Problems.AOC2024.Day5;
[ProblemInfo(2024, 5, "Print Queue")]
internal class PrintQueue : Problem<int, int>
{
private List<Rule> _rules = [];
private List<int[]> updates = [];
public override void CalculatePart1()
{
foreach (var update in updates)
{
if (IsOrdered(update, out _))
{
var mid = update[update.Length / 2];
Part1 += mid;
}
}
}
public bool IsOrdered(int[] update, out List<int> orderd)
{
var list = new PageList(update, _rules);
orderd = list.Traverse();
return orderd.Zip(update).All(e => e.First== e.Second);
}
public int[] SortUpdates(int[] updates)
{
throw new NotImplementedException();
}
public override void CalculatePart2()
{
foreach (var update in updates)
{
if (!IsOrdered(update, out var ordered))
{
var mid = ordered[update.Length / 2];
Part2 += mid;
}
}
}
public override void LoadInput()
{
var lines = ReadInputLines("input.txt");
var parsingPages = false;
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line))
{
parsingPages = true;
continue;
}
if (parsingPages)
{
updates.Add(line.Split(',').Select(int.Parse).ToArray());
}
else{
var d = line.Split('|').Select(int.Parse);
_rules.Add((d.First(), d.Last()));
}
}
}
}