isundil 7 жил өмнө
parent
commit
59bb2d1716
2 өөрчлөгдсөн 227 нэмэгдсэн , 0 устгасан
  1. 101 0
      d7/input
  2. 126 0
      d7/main.js

+ 101 - 0
d7/input

@@ -0,0 +1,101 @@
+Step G must be finished before step X can begin.
+Step X must be finished before step B can begin.
+Step A must be finished before step I can begin.
+Step D must be finished before step H can begin.
+Step O must be finished before step T can begin.
+Step H must be finished before step C can begin.
+Step S must be finished before step E can begin.
+Step U must be finished before step M can begin.
+Step M must be finished before step Z can begin.
+Step R must be finished before step N can begin.
+Step C must be finished before step Q can begin.
+Step T must be finished before step P can begin.
+Step I must be finished before step W can begin.
+Step W must be finished before step N can begin.
+Step P must be finished before step J can begin.
+Step N must be finished before step F can begin.
+Step Y must be finished before step J can begin.
+Step J must be finished before step L can begin.
+Step L must be finished before step E can begin.
+Step E must be finished before step B can begin.
+Step Q must be finished before step B can begin.
+Step F must be finished before step K can begin.
+Step V must be finished before step K can begin.
+Step Z must be finished before step B can begin.
+Step B must be finished before step K can begin.
+Step G must be finished before step U can begin.
+Step E must be finished before step V can begin.
+Step A must be finished before step Z can begin.
+Step C must be finished before step V can begin.
+Step R must be finished before step B can begin.
+Step Q must be finished before step Z can begin.
+Step R must be finished before step K can begin.
+Step T must be finished before step B can begin.
+Step L must be finished before step B can begin.
+Step M must be finished before step K can begin.
+Step T must be finished before step Z can begin.
+Step W must be finished before step B can begin.
+Step I must be finished before step E can begin.
+Step A must be finished before step M can begin.
+Step V must be finished before step Z can begin.
+Step Y must be finished before step B can begin.
+Step Q must be finished before step F can begin.
+Step W must be finished before step Y can begin.
+Step U must be finished before step K can begin.
+Step D must be finished before step F can begin.
+Step P must be finished before step F can begin.
+Step N must be finished before step L can begin.
+Step H must be finished before step T can begin.
+Step H must be finished before step L can begin.
+Step C must be finished before step T can begin.
+Step H must be finished before step I can begin.
+Step Z must be finished before step K can begin.
+Step L must be finished before step Z can begin.
+Step Y must be finished before step K can begin.
+Step I must be finished before step V can begin.
+Step P must be finished before step K can begin.
+Step P must be finished before step N can begin.
+Step G must be finished before step D can begin.
+Step I must be finished before step J can begin.
+Step H must be finished before step K can begin.
+Step L must be finished before step Q can begin.
+Step D must be finished before step M can begin.
+Step O must be finished before step V can begin.
+Step R must be finished before step L can begin.
+Step D must be finished before step W can begin.
+Step M must be finished before step J can begin.
+Step O must be finished before step R can begin.
+Step N must be finished before step Z can begin.
+Step Y must be finished before step V can begin.
+Step W must be finished before step L can begin.
+Step U must be finished before step Y can begin.
+Step S must be finished before step V can begin.
+Step M must be finished before step P can begin.
+Step X must be finished before step A can begin.
+Step A must be finished before step E can begin.
+Step A must be finished before step L can begin.
+Step A must be finished before step R can begin.
+Step V must be finished before step B can begin.
+Step P must be finished before step B can begin.
+Step E must be finished before step F can begin.
+Step T must be finished before step V can begin.
+Step S must be finished before step R can begin.
+Step T must be finished before step F can begin.
+Step P must be finished before step Y can begin.
+Step A must be finished before step C can begin.
+Step J must be finished before step F can begin.
+Step H must be finished before step B can begin.
+Step C must be finished before step E can begin.
+Step P must be finished before step E can begin.
+Step D must be finished before step I can begin.
+Step X must be finished before step F can begin.
+Step T must be finished before step Q can begin.
+Step J must be finished before step B can begin.
+Step C must be finished before step B can begin.
+Step P must be finished before step Q can begin.
+Step H must be finished before step R can begin.
+Step F must be finished before step B can begin.
+Step T must be finished before step J can begin.
+Step A must be finished before step W can begin.
+Step N must be finished before step K can begin.
+Step T must be finished before step E can begin.

+ 126 - 0
d7/main.js

@@ -0,0 +1,126 @@
+
+function read(done) {
+    require("fs").readFile('./input', 'utf8', (err, data) => {
+        var taskPool = new TaskPool();
+        data.split("\n").forEach((line) => {
+            var arr = line.match(/\s([A-Z])\s.*\s([A-Z])\s/);
+            if (arr) {
+                var from = taskPool.getOrCreate(arr[1]),
+                    to = taskPool.getOrCreate(arr[2]);
+                from.neededBy.push(to);
+                to.needs.push(from);
+            }
+        });
+        done(taskPool);
+    });
+}
+
+function Task(taskId) {
+    this.taskId = taskId;
+    this.done = false;
+    this.startedAt = -1;
+    this.duration = 61 +taskId.charCodeAt(0) -"A".charCodeAt(0);
+    this.needs = [];
+    this.neededBy = [];
+}
+
+Task.prototype.isReady = function() {
+    var c = true;
+    this.needs.some(i => {
+        c &= i.done;
+        return !c;
+    });
+    return c;
+}
+
+function TaskPool() {
+    this.tasks = {},
+    this.getOrCreate = function(taskId) {
+        if (this.tasks[taskId])
+            return this.tasks[taskId];
+        return this.tasks[taskId] = new Task(taskId);
+    };
+}
+
+Array.prototype.containsAll = function(arr) {
+    var all = true;
+    arr.some(i => {
+        if (this.indexOf(i.taskId) == -1)
+            all = false;
+        return !all;
+    });
+    return all;
+}
+
+function nextObj(taskPool) {
+    var canDo = [];
+    for (var i in taskPool.tasks) {
+        var t = taskPool.tasks[i];
+        if (!t.done && t.startedAt < 0 && t.isReady())
+            canDo.push(i);
+    }
+    canDo.sort();
+    if (canDo.length)
+        taskPool.tasks[canDo[0]].done = 1;
+    return taskPool.tasks[canDo[0]];
+}
+
+function nextObjTime(taskPool, currentTime, nbWorkers) {
+    var remainTask = 0,
+        taskToFinish = 0;
+    for (var i in taskPool.tasks) {
+        var t = taskPool.tasks[i];
+        if (!t.done && t.startedAt >= 0) {
+            if (t.startedAt +t.duration <= currentTime)
+                t.done = true;
+            else
+                --nbWorkers;
+        }
+        if (t.startedAt == -1)
+            ++remainTask;
+        if (!t.done)
+            ++taskToFinish;
+    }
+    while (nbWorkers > 0 && remainTask) {
+        var task = nextObj(taskPool);
+        if (task) {
+            task.done = false;
+            task.startedAt = currentTime;
+            --remainTask;
+        }
+        else
+            return true;
+        --nbWorkers;
+    }
+    return taskToFinish > 0;
+}
+
+function ex1() {
+    read(function(taskPool){
+        var result = "";
+        while (true) {
+            var step = nextObj(taskPool);
+            if (!step)
+                break;
+            result += step.taskId;
+        }
+        console.log(result);
+    });
+}
+
+function ex2() {
+    read(function(taskPool){
+        var time =0;
+        while (true) {
+            var step = nextObjTime(taskPool, time, 5);
+            if (!step)
+                break;
+            ++time;
+        }
+        console.log(time);
+    });
+}
+
+ex1();
+ex2();
+