01 March 2024 | Challenge 258 |

# Sum Even Bits

## 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
```

### Solution

Convert the number into base B representation and `grep`

for those having an even number of digits.

```
use Math::Prime::Util 'todigits';
sub cedn {
my $base = shift;
scalar grep !(scalar(todigits($_, $base)) % 2), @_
}
```

See the full solution.

## 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[4] = 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
```

### Solution

`unpack`

’s format `'%32b*'`

provides a simple way to count the bits in a bit vector.
Packing each of the numbers’ indices, counting its bits, `grep`

ing for exactly `$k`

bits, take the result as an array slice and sum over its elements.

```
use List::Util 'sum0';
sub k_bit_sum {
my $k = shift;
sum0 @_[grep unpack('%32b*', pack('l', $_)) == $k, 0 .. $#_];
}
```

See the full solution.