Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }