public static string SolvePart1(string[] input) { var graph = GraphNodeFactory.ParseGraph(input); // Eval loop var result = ""; while (graph.Count > 0) { var current = graph.OrderBy(n => n.Id).Where(n => n.Ready).First(); graph.AddRange(current.Next); current.Done = true; result += current.Id; graph.RemoveAll(n => n.Done); } return(result); }
public static int SolvePart2(string[] input) { var graph = GraphNodeFactory.ParseGraph(input); // Eval loop var iteration = 0; var workersAvailable = 5; while (graph.Count > 0) { if (workersAvailable > 0) { var readyTasks = graph .OrderBy(n => n.Id) .Where(n => n.Ready && !n.Working) .Take(workersAvailable); workersAvailable -= readyTasks.Count(); foreach (var task in readyTasks) { task.Working = true; task.StartedTimestamp = iteration; } } iteration += 1; var finishedTasks = graph .OrderBy(n => n.Id) .Where(n => n.Working && n.StartedTimestamp + n.Duration == iteration); foreach (var task in finishedTasks) { task.Done = true; graph.AddRange(task.Next); workersAvailable += 1; } graph.RemoveAll(n => n.Done); } return(iteration); }