main.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. function read(done) {
  2. require("fs").readFile('./input', 'utf8', (err, data) => {
  3. var taskPool = new TaskPool();
  4. data.split("\n").forEach((line) => {
  5. var arr = line.match(/\s([A-Z])\s.*\s([A-Z])\s/);
  6. if (arr) {
  7. var from = taskPool.getOrCreate(arr[1]),
  8. to = taskPool.getOrCreate(arr[2]);
  9. from.neededBy.push(to);
  10. to.needs.push(from);
  11. }
  12. });
  13. done(taskPool);
  14. });
  15. }
  16. function Task(taskId) {
  17. this.taskId = taskId;
  18. this.done = false;
  19. this.startedAt = -1;
  20. this.duration = 61 +taskId.charCodeAt(0) -"A".charCodeAt(0);
  21. this.needs = [];
  22. this.neededBy = [];
  23. }
  24. Task.prototype.isReady = function() {
  25. var c = true;
  26. this.needs.some(i => {
  27. c &= i.done;
  28. return !c;
  29. });
  30. return c;
  31. }
  32. function TaskPool() {
  33. this.tasks = {},
  34. this.getOrCreate = function(taskId) {
  35. if (this.tasks[taskId])
  36. return this.tasks[taskId];
  37. return this.tasks[taskId] = new Task(taskId);
  38. };
  39. }
  40. Array.prototype.containsAll = function(arr) {
  41. var all = true;
  42. arr.some(i => {
  43. if (this.indexOf(i.taskId) == -1)
  44. all = false;
  45. return !all;
  46. });
  47. return all;
  48. }
  49. function nextObj(taskPool) {
  50. var canDo = [];
  51. for (var i in taskPool.tasks) {
  52. var t = taskPool.tasks[i];
  53. if (!t.done && t.startedAt < 0 && t.isReady())
  54. canDo.push(i);
  55. }
  56. canDo.sort();
  57. if (canDo.length)
  58. taskPool.tasks[canDo[0]].done = 1;
  59. return taskPool.tasks[canDo[0]];
  60. }
  61. function nextObjTime(taskPool, currentTime, nbWorkers) {
  62. var remainTask = 0,
  63. taskToFinish = 0;
  64. for (var i in taskPool.tasks) {
  65. var t = taskPool.tasks[i];
  66. if (!t.done && t.startedAt >= 0) {
  67. if (t.startedAt +t.duration <= currentTime)
  68. t.done = true;
  69. else
  70. --nbWorkers;
  71. }
  72. if (t.startedAt == -1)
  73. ++remainTask;
  74. if (!t.done)
  75. ++taskToFinish;
  76. }
  77. while (nbWorkers > 0 && remainTask) {
  78. var task = nextObj(taskPool);
  79. if (task) {
  80. task.done = false;
  81. task.startedAt = currentTime;
  82. --remainTask;
  83. }
  84. else
  85. return true;
  86. --nbWorkers;
  87. }
  88. return taskToFinish > 0;
  89. }
  90. function ex1() {
  91. read(function(taskPool){
  92. var result = "";
  93. while (true) {
  94. var step = nextObj(taskPool);
  95. if (!step)
  96. break;
  97. result += step.taskId;
  98. }
  99. console.log(result);
  100. });
  101. }
  102. function ex2() {
  103. read(function(taskPool){
  104. var time =0;
  105. while (true) {
  106. var step = nextObjTime(taskPool, time, 5);
  107. if (!step)
  108. break;
  109. ++time;
  110. }
  111. console.log(time);
  112. });
  113. }
  114. ex1();
  115. ex2();