## Perl Weekly Challenge 283: Digit Count Value

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

Spoiler Alert: This blog post provides some solutions to this challenge. Please don’t read on if you intend to complete the challenge on your own.

## Task 2: Digit Count Value

You are given an array of positive integers, `@ints`.

Write a script to return true if for every index `i` in the range `0 <= i < size of array`, the digit `i` occurs exactly the `\$ints[\$i]` times in the given array otherwise return false.

Example 1

``````Input: @ints = (1, 2, 1, 0)
Ouput: true

\$ints[0] = 1, the digit 0 occurs exactly 1 time.
\$ints[1] = 2, the digit 1 occurs exactly 2 times.
\$ints[2] = 1, the digit 2 occurs exactly 1 time.
\$ints[3] = 0, the digit 3 occurs 0 time.
``````

Example 2

``````Input: @ints = (0, 3, 0)
Ouput: false

\$ints[0] = 0, the digit 0 occurs 2 times rather than 0 time.
\$ints[1] = 3, the digit 1 occurs 0 time rather than 3 times.
\$ints[2] = 0, the digit 2 occurs exactly 0 time.
``````

### Digit Count Value in Raku

We first use a Bag to create the `count` histogram of frequencies. For some obscure reason, I wasn't able to use the `bag` directly (as I did for task 1 of this same challenge), and has to coerce the `bag` into a hash. Then, we check for each index in the array range that the input value matches the count. Actually, we return `False` if it doesn't match, and return `True` at the end of the loop if we reach there.

``````sub digit-count-value (@in) {
my %count = @in.Bag;
for 0..@in.end -> \$i {
return False if %count{\$i}:exists and
@in[\$i] != %count{\$i};
}
return True;
}

my @tests = <1 2 1 0>, <0 3 0>;
for @tests -> @test {
printf "%-8s => ", "@test[]";
say digit-count-value @test;
}
``````

This program displays the following output:

``````\$ raku ./digit-count-value.raku
1 2 1 0  => True
0 3 0    => False
``````

### Digit Count Value in Perl

This is a port to Perl of the above Raku program. Note that we use a hash (`%count`) to host the histogram of frequencies.

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

sub digit_count_value {
my @in = @_;
my %count;
\$count{\$_}++ for @in;
for my \$i (0..\$#in) {
return "False" if exists \$count{\$i} and
\$in[\$i] != \$count{\$i};
}
return "True";
}

my @tests = ( [<1 2 1 0>], [<0 3 0>] );
for my \$test (@tests) {
printf "%-8s => ", "@\$test";
say digit_count_value @\$test;
}
``````

This program displays the following output:

``````\$ perl ./digit-count-value.pl
1 2 1 0  => True
0 3 0    => False
``````

## 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 September 1, 2024. And, please, also spread the word about the Perl Weekly Challenge if you can.