private static bool IsFinished(NodeExt node, int timer) { if (node.Running) { if (node.StartedAt + node.Duration == timer) { return(true); } } return(false); }
public static void Solve() { var graph = new Graph("inputs/day07.txt"); // Pt 1 var sorted = Graph.Clone(graph).TopologicalSort(); Console.WriteLine(string.Join("", sorted.Select(e => e.Label))); var sortedExt = sorted.Select(n => new NodeExt(n.Label, BaseDuration)); var todo = new List <NodeExt>(sortedExt); var done = new HashSet <NodeExt>(); var doing = new HashSet <NodeExt>(); var workers = new NodeExt[NoWorkers]; // Pt 2 Console.WriteLine(); PrintHeader(workers); var timer = 0; while (todo.Any() || doing.Any()) { for (int i = 0; i < workers.Length; i++) { // If worker has no task assigned, assign new if (workers[i] is null && todo.Any()) { AssignTaskToWorker(todo, done, doing, workers, timer, i, graph); continue; } // If worker has task assigned, check if it has finished and assign new if (workers[i] != null && IsFinished(workers[i], timer)) { RemoveTaskFromWorker(done, doing, workers, timer, i, ref graph); AssignTaskToWorker(todo, done, doing, workers, timer, i, graph); } } Print(workers, timer, done); timer++; } ; }