#!/usr/bin/env perl
use v5.38;
sub PriorityTaskScheduler(@raw_jobs) {
my ($time, %wait, %bag) = 0;
my @jobs = map { my %h; @h{qw(title submit duration priority)} = split(',', $_); \%h } @raw_jobs;
@jobs = sort { $a->{submit} <=> $b->{submit} || $b->{priority} <=> $a->{priority} } @jobs;
while (my $job = shift(@jobs)) {
$time = $job->{submit} if $time < $job->{submit};
$wait{$job->{priority}} += $time > $job->{submit} ? $time - $job->{submit} : 0;
$bag{$job->{priority}}++;
$time += $job->{duration};
@jobs = sort {
($a->{submit} > $time) <=> ($b->{submit} > $time) ||
$b->{priority} <=> $a->{priority} ||
$a->{submit} <=> $b->{submit}
} @jobs;
}
map { sprintf "Priority-%s: %d", $_, $wait{$_} / $bag{$_} } reverse sort keys %wait
}
my @data = (
"jobA,0,10,3\njobB,2,5,1\njobC,3,8,3\njobD,7,4,2\n",
"jobB,2,5,1\njobA,0,10,3\njobC,3,8,3\njobD,7,4,2\njobE,20,4,3",
"jobA,0,5,1\njobB,100,10,5\njobC,101,5,5",
);
for my $test (@data) {
my @jobs = split "\n", $test;
say "[", join(", ", PriorityTaskScheduler(@jobs)), "]";
}