Here's a very straightforward version that implements
"given a 7-min timer & a 4-min egg timer"
rather than
"given unlimited 7-min timers & unlimited 4-min egg timers
It's unclear what the OP intended.
use List::Util qw( min );
use List::MoreUtils qw( any );
my $target = 5;
my @max = (7, 4);
my $time = 0;
my @status = (0) x @max;
my %seen;
for (;;) {
die("Unable to solve the problem\n")
if $seen{join('|', @status)}++;
foreach (0..$#status) {
next if $status[$_];
$status[$_] = $max[$_];
print("$time: begin $max[$_]\n");
}
last if any { $_ == $target } @status;
my $elapsed_time = min(@status);
$status[$_] = $status[$_] - $elapsed_time
foreach 0..$#status;
$time += $elapsed_time;
}
print("$time: begin cooking\n");
$time += $target;
print("$time: end cooking\n");
outputs
0: begin 7
0: begin 4
4: begin 4
7: begin 7
8: begin 4
12: begin 4
14: begin 7
16: begin 4
16: begin cooking
21: end cooking
I don't support putting the timer's on hold, but that's just laziness on my end :)
.oO( Why aren't Scalar::Util, List::Util and List::MoreUtils core modules? I wouldn't mind if the function in those modules were core functions! )