diff options
author | Nat Lasseter <user@4574.co.uk> | 2018-12-07 11:25:40 +0000 |
---|---|---|
committer | Nat Lasseter <user@4574.co.uk> | 2018-12-07 11:25:40 +0000 |
commit | b4c9a987745cb784ad75373029a77d4ab6429c19 (patch) | |
tree | 7fa4af026f092948f13721e6547a68dd0bb32f2c /day07/part2 | |
parent | 0601ee07997c1fc76e912ec060bc7ae82ecfcae1 (diff) |
[day07] Done
Diffstat (limited to 'day07/part2')
-rwxr-xr-x | day07/part2 | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/day07/part2 b/day07/part2 new file mode 100755 index 0000000..eb71690 --- /dev/null +++ b/day07/part2 @@ -0,0 +1,47 @@ +#!/usr/bin/env ruby + +input = $stdin.readlines.map do |i| + i =~ /Step ([A-Z]) must be finished before step ([A-Z]) can begin./ + [$2, $1] +end + +steps = input.flatten.uniq.sort +prereqs = {} +workers = Array.new(5, nil) +now = 0 + +steps.each do |s| + prereqs[s] = [] +end + +input.each do |i| + prereqs[i.first] << i.last +end + +until prereqs.empty? && !workers.any? do + workers.each_index do |i| + next unless workers[i] + workers[i][1] -= 1 + if workers[i][1].zero? + ns = workers[i][0] + prereqs.each_key do |k| + prereqs[k].delete(ns) + end + workers[i] = nil + end + end + + next_steps = prereqs.select { |k,v| v.empty? }.keys.sort + workers.each_index do |i| + unless workers[i] || next_steps.empty? + ns = next_steps.shift + time = ns.ord - 64 + 60 + workers[i] = [ns, time] + prereqs.delete(ns) + end + end + + now += 1 +end + +puts now - 1 |