Skip to content

Instantly share code, notes, and snippets.

@lethern
Created December 7, 2018 13:31
Show Gist options
  • Save lethern/4aad32b034a94bee7833baf32491ebf6 to your computer and use it in GitHub Desktop.
Save lethern/4aad32b034a94bee7833baf32491ebf6 to your computer and use it in GitHub Desktop.
fs.readFile('07_input', 'utf8', function (err, _contents) {
let contents = _contents.split`\n`;
contents.splice(-1, 1);
let nodes = new Map();
for (row of contents) {
let from = row[5];
let to = row[36];
if (!nodes.get(from)) nodes.set(from, { edges: new Map() } );
if (!nodes.get(to)) nodes.set(to, { edges: new Map() } );
nodes.get(to).edges.set(from, nodes.get(from));
}
let A = [];
nodes.forEach((val, key) => A.push(key));
let A_sort_func = (a, b) => {
let b_size = nodes.get(b).edges.size;
let a_size = nodes.get(a).edges.size;
if (b_size == a_size) return a.localeCompare(b);
return a_size - b_size;
};
A.sort(A_sort_func);
let workers = [];
for (i = 0; i < 5; ++i) workers.push({ time: 0, elem: null });
let result = [];
let seconds = 0;
while (A.length) {
for (it in workers) {
if (workers[it].time > 0) continue;
if (!A.length) break;
let elem = A[0];
if (nodes.get(elem).edges.size > 0) break;
A.shift(); // aka pop first
workers[it].time = 61 + elem.codePointAt(0) - 'A'.codePointAt(0);
workers[it].elem = elem;
}
for (it in workers) {
--workers[it].time;
if (workers[it].time == 0) {
let elem = workers[it].elem;
nodes.forEach((val) => {
val.edges.delete(elem);
});
result.push(elem);
}
}
A.sort(A_sort_func);
++seconds;
}
while (true) {
all_done = true;
for (it in workers) {
if (workers[it].time > 0) all_done = false;
--workers[it].time;
if (workers[it].time == 0)
result.push(workers[it].elem);
}
if (all_done) break;
++seconds;
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment