Exemple #1
0
 private static bool IsFinished(NodeExt node, int timer)
 {
     if (node.Running)
     {
         if (node.StartedAt + node.Duration == timer)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #2
0
        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++;
            }
            ;
        }