http://www.perlmonks.org?node_id=547060

in reply to Challenge: Egg Timer Puzzles

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! )

Replies are listed 'Best First'.
Re^2: Challenge: Egg Timer Puzzles
by Limbic~Region (Chancellor) on May 03, 2006 at 13:05 UTC
ikegami,
It's unclear what the OP intended.

Indeed. I updated the root thread to reflect my intentions though I still want people to be able to intepret the puzzle any way they want. These are fun distractions that I like to post and aren't intended to be right or wrong.

Thanks for your contribution. Compare your solution to my by hand solution for a 20 minute target with 3/5/13/19 egg timers.

```3    5    13    19
Step1.  3 & 5 together (elapsed time 3 minutes)

3    2/3    13    19
Step2.  3 & 13 together (elapsed time 6 minutes)

3    2/3    3/10    19
Step3.  10 & 19 together (elapsed time 16 minutes)

3    2/3    13    9/10
Step4.  2 & 9 together (elapsed time 18 minutes)

3    5    13    7/12
Step5.  Begin cooking & start 13 (elapsed time 31 minutes)

3    5    13    7/12
Step6.  start 7 (elapsed time 38 minutes)

3    5    13    19
Step7.  Finish cooking 38 - 18 = 20
Also see where yours fails for 21.
```3    5    13    19
Step1 A.  Begin cooking & start 19 (elapsed time 19 minutes)
Step1 B.  Simultaneously start 3 & 5 (no change to elapsed time)

3    2/3    13    19
Step2.  Start 2 (elapsed time 21 minutes)

Step3.  Finish cooking