# Perl Weekly Challenge 258.

My solutions (task 1 and task 2 ) to the The Weekly Challenge - 258.

# Task 1: Count Even Digits Number

``````Submitted by: Mohammad Sajid Anwar
You are given a array of positive integers, @ints.

Write a script to find out how many integers have even number of digits.

Example 1
Input: @ints = (10, 1, 111, 24, 1000)
Output: 3

There are 3 integers having even digits i.e. 10, 24 and 1000.
Example 2
Input: @ints = (111, 1, 11111)
Output: 0
Example 3
Input: @ints = (2, 8, 1024, 256)
Output: 1
``````

I just have to count the digits of each input modulo 2 and use the result to filter numbers with even number of digits and count them. This fits a short half-liner.

Example 1:

``````perl -E 'say "@ARGV -> ", 0+grep {(split "")%2==0}@ARGV' 10 1 111 24 1000
``````

Results:

``````10 1 111 24 1000 -> 3
``````

Example 2:

``````perl -E 'say "@ARGV -> ", 0+grep {(split "")%2==0}@ARGV' 111 1 11111
``````

Results:

``````111 1 11111 -> 0
``````

Example 3:

``````perl -E 'say "@ARGV -> ", 0+grep {(split "")%2==0}@ARGV' 2 8 1024 246
``````

Results:

``````2 8 1024 246 -> 1
``````

The corresponding full code is

`````` 1  # Perl weekly challenge 258
2  # Task 1:  Count Even Digits Number
3  #
5  use v5.36;
6  use List::Util qw(all);
7  die <<~"FIN" unless @ARGV;
8      Usage: \$0 N1 [N2...]
9      to count how many input numbers have an even number of digits.
10      FIN
11  die "Only digits allowed" unless all {/^\d+\$/} @ARGV;
12  say "@ARGV -> ", 0+grep {(split "")%2==0}@ARGV;
``````

Examples:

``````./ch-1.pl 10 1 111 24 1000
./ch-1.pl 111 1 11111
./ch-1.pl 2 8 1024 246
``````

Results:

``````10 1 111 24 1000 -> 3
111 1 11111 -> 0
2 8 1024 246 -> 1
``````

# Task 2: Sum of Values

``````Submitted by: Mohammad Sajid Anwar
You are given an array of integers, @int and an integer \$k.

Write a script to find the sum of values whose index binary representation
has exactly \$k number of 1-bit set.

Example 1
Input: @ints = (2, 5, 9, 11, 3), \$k = 1
Output: 17

Binary representation of index 0 = 0
Binary representation of index 1 = 1
Binary representation of index 2 = 10
Binary representation of index 3 = 11
Binary representation of index 4 = 100

So the indices 1, 2 and 4 have total one 1-bit sets.
Therefore the sum, \$ints[1] + \$ints[2] + \$ints[3] = 17
Example 2
Input: @ints = (2, 5, 9, 11, 3), \$k = 2
Output: 11
Example 3
Input: @ints = (2, 5, 9, 11, 3), \$k = 0
Output: 2
``````

(There is a mistake in the explanation of example 1: `\$ints[3]` should have been `\$ints[4]`) I can filter all the indices according to their number of bits, and then sum the corresponding values. This fits a one-liner.

Example 1:

``````perl -MList::Util=sum0 -E '
(\$k,@v)=@ARGV; say "k=\$k, ints=@v -> ", sum0 @v[grep {\$k==sum0 split "", sprintf "%b",\$_}0..@v-1];
' 1 2 5 9 11 3
``````

Results:

``````k=1, ints=2 5 9 11 3 -> 17
``````

Example 2:

``````perl -MList::Util=sum0 -E '
(\$k,@v)=@ARGV; say "k=\$k, ints=@v -> ", sum0 @v[grep {\$k==sum0 split "", sprintf "%b",\$_}0..@v-1];
' 2 2 5 9 11 3
``````

Results:

``````k=2, ints=2 5 9 11 3 -> 11
``````

Example 3:

``````perl -MList::Util=sum0 -E '
(\$k,@v)=@ARGV; say "k=\$k, ints=@v -> ", sum0 @v[grep {\$k==sum0 split "", sprintf "%b",\$_}0..@v-1];
' 0 2 5 9 11 3
``````

Results:

``````k=0, ints=2 5 9 11 3 -> 2
``````

The full code follows:

`````` 1  # Perl weekly challenge 258
2  # Task 2:  Sum of Values
3  #
5  use v5.36;
6  use List::Util qw(sum0);
7  die <<~"FIN" unless @ARGV;
8      Usage: \$0 K N0 [N1...]
9      to sum the values of Nm whose index m has K ones in its binary representation
10      FIN
11  my (\$k,@int)=@ARGV;
12  # Convert to binary, add ones and compare to \$k to filter indices
13  my @indices=grep {\$k==sum0 split "", sprintf "%b",\$_}0..@int-1;
14  my \$result=sum0 @int[@indices];
15  say "k=\$k, ints=@int -> ", \$result;
``````

Example:

``````./ch-2.pl 1 2 5 9 11 3
./ch-2.pl 2 2 5 9 11 3
./ch-2.pl 0 2 5 9 11 3
``````

Results:

``````k=1, ints=2 5 9 11 3 -> 17
k=2, ints=2 5 9 11 3 -> 11
k=0, ints=2 5 9 11 3 -> 2
``````

/;

Written on February 26, 2024