## Perl Weekly Challenge 276: Complete Day

These are some answers to the Week 276, Task 1, of the Perl Weekly Challenge organized by Mohammad S. Anwar.

Spoiler Alert: This weekly challenge deadline is due in a few days from now (on July 7, 2024 at 23:59). This blog post provides some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.

You are given an array of integers, `@hours`.

Write a script to return the number of pairs that forms a complete day.

A complete day is defined as a time duration that is an exact multiple of 24 hours.

Example 1

``````Input: @hours = (12, 12, 30, 24, 24)
Output: 2

Pair 1: (12, 12)
Pair 2: (24, 24)
``````

Example 2

``````Input: @hours = (72, 48, 24, 5)
Output: 3

Pair 1: (72, 48)
Pair 2: (72, 24)
Pair 3: (48, 24)
``````

Example 3

``````Input: @hours = (12, 18, 24)
Output: 0
``````

### Complete Day in Raku

I have been trying to think about more clever solutions, but they quickly turned out to be far too complicated. By contrast, the brute force approach is very simple: we simply generate all possible pairs (with the combinations method) and keep the count of those whose sum is evenly divided by 24.

``````sub complete-day (@in) {
my \$count = 0;
for @in.combinations: 2 -> @pair {
\$count++ if ([+] @pair) %% 24;
}
return \$count;

my @tests = <12 12 30 24 24>, <72 48 24 5>, <12 18 24>;
for @tests -> @test {
printf "%-15s => ", "@test[]";
say complete-day @test;
}
``````

This program displays the following output:

``````\$ raku ./complete-days.raku
12 12 30 24 24  => 2
72 48 24 5      => 3
12 18 24        => 0
``````

### Complete Day in Perl

This is a port to Perl of the above Raku program. However, since Perl doesn't have a built-in `combinations` function, we generate all possible pairs "by hand" with nested loops.

``````use strict;
use warnings;
use feature 'say';

sub complete_day {
my @in = @_;
my \$count = 0;
for my \$i (0..\$#in) {
for my \$j (\$i+1..\$#in) {
\$count++ if (\$in[\$i] + \$in[\$j]) % 24 == 0;
}
}
return \$count;
}

my @tests = ([<12 12 30 24 24>], [<72 48 24 5>], [<12 18 24>]);
for my \$test (@tests) {
printf "%-15s => ", "@\$test";
say complete_day @\$test;
}
``````

This program displays the following output:

``````\$ perl ./complete-days.pl
12 12 30 24 24  => 2
72 48 24 5      => 3
12 18 24        => 0
``````

## Wrapping up

The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on July 14, 2024. And, please, also spread the word about the Perl Weekly Challenge if you can.