timeElapsed = {
let completedTasks = [];
let secondsElapsed = 0;
let timers = new Array(numWorkers).fill(0);
let tasks = new Array(numWorkers).fill('');
let remainingTasks = new Set(nodes);
while (true) {
for (let w = 0; w < timers.length; w++) {
timers[w] = Math.max(0, timers[w] - 1);
if (timers[w] === 0 && tasks[w].length) {
completedTasks.push(tasks[w]);
tasks[w] = '';
}
}
let availableTasks = [...remainingTasks].filter(
n => isSubset(dependencies[n], new Set(completedTasks))).sort();
if (availableTasks.length === 0 && timers.every(t => t === 0)) {
return secondsElapsed;
}
for (let w = 0; w < timers.length; w++) {
if (availableTasks.length) {
if (timers[w] === 0) {
tasks[w] = availableTasks.shift();
timers[w] = taskTimeFloor + tasks[w].charCodeAt(0) - 64;
remainingTasks.delete(tasks[w]);
}
}
}
secondsElapsed++;
}
}