Quick actions

cmd+k|ctrl+k

Navigation

Languages

Untitled

Snippet info

Language

Perl

Visibility

unlisted

Author

legacy-anonymous

Created

2026-02-07T17:04:13.48697Z

Updated

2026-02-07T17:04:13.48697Z

#!/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)), "]";
}
INFO