Skip to content

Instantly share code, notes, and snippets.

@solson
Created December 10, 2018 17:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save solson/2ba2747c473c3a3ce5df3034836a7f07 to your computer and use it in GitHub Desktop.
Save solson/2ba2747c473c3a3ce5df3034836a7f07 to your computer and use it in GitHub Desktop.
multi advent('day07', '2', Str $in) {
my SetHash %prereqs = parse-prereqs($in);
my $time = 0;
my @queue;
while %prereqs || @queue {
my @available = %prereqs.grep(!*.value).map(*.key).sort;
# Assign as many free workers to available tasks as possible.
while @queue < 5 && @available {
my $task = @available.shift;
@queue.push: $task => $time + 60 + ($task.ord - 'A'.ord + 1);
%prereqs{$task}:delete;
}
# Step forward in time and finish a task.
@queue.=sort(*.value);
(my $task, $time) = @queue.shift.kv;
$_{$task}-- for %prereqs.values;
}
$time
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment