Skip to content

Instantly share code, notes, and snippets.

@jbevain
Created December 5, 2024 05:38
Show Gist options
  • Select an option

  • Save jbevain/effdce9fa87c1c92561091abf6a149dd to your computer and use it in GitHub Desktop.

Select an option

Save jbevain/effdce9fa87c1c92561091abf6a149dd to your computer and use it in GitHub Desktop.
var state = ParseState.OrderingRules;
Dictionary<int, HashSet<int>> rules = [];
List<List<int>> pageOrders = [];
var reader = new StringReader(input);
while (reader.ReadLine() is string line)
{
if (state == ParseState.OrderingRules)
{
if (line == "")
{
state = ParseState.PagesInUpdate;
continue;
}
var parts = line.Split('|');
var from = int.Parse(parts[0]);
var to = int.Parse(parts[1]);
if (!rules.TryGetValue(from, out var tos))
{
rules[from] = [to];
}
else
{
tos.Add(to);
}
}
else if (state == ParseState.PagesInUpdate)
{
pageOrders.Add(line.Split(',').Select(int.Parse).ToList());
}
}
bool IsPageOrderValid(List<int> pageOrder)
{
for (int i = 1; i < pageOrder.Count; i++)
{
if (rules.TryGetValue(pageOrder[i - 1], out var tos) && tos.Contains(pageOrder[i]))
{
continue;
}
else
{
return false;
}
}
return true;
}
var sum1 = 0;
foreach (var pageOrder in pageOrders)
{
if (IsPageOrderValid(pageOrder))
{
sum1 += pageOrder[pageOrder.Count / 2];
}
}
Console.WriteLine(sum1);
int sum2 = 0;
foreach (var pageOrder in pageOrders)
{
if (!IsPageOrderValid(pageOrder))
{
pageOrder.Sort((a, b) => rules.TryGetValue(a, out var ato) && ato.Contains(b) ? -1 : 1);
sum2 += pageOrder[pageOrder.Count / 2];
}
}
Console.WriteLine(sum2);
enum ParseState
{
OrderingRules,
PagesInUpdate,
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment