# The Weekly Challenge - 263 (April 1st 2024)

## Task #1: Target Index

You are given an array of integers, `@int`

s and a target element `$k`

.

Write a script to return the list of indices in the sorted array where the element is same as the given target element.

**Example 1**

Input: @ints = (1, 5, 3, 2, 4, 2), $k = 2 Output: (1, 2) Sorted array: (1, 2, 2, 3, 4, 5) Target indices: (1, 2) as $ints[1] = 2 and $k[2] = 2

Sorted array is `(1, 2, 2, 3, 4, 5)`

, index `1`

and `2`

have value `2`

.

**Example 2**

Input: @ints = (1, 2, 4, 3, 5), $k = 6 Output: ()

No entries have value `6`

– so no matches.

**Example 3**

Input: @ints = (5, 3, 2, 4, 2, 1), $k = 4 Output: (4)

Sorted array is `(1, 2, 2, 3, 4, 5)`

, value at index `4`

is equal to `4`

.

## Solution

It looks like we need to sort – **BUT WE DON’T** – we know that the first index will be the number of numbers less than `$k`

, and the number of matching numbers is the number of numbers equal to `$k`

.

Like last week, we use the spaceship operator to compute the values larger/smaller than `$k`

.

If we create the counts array (0) x 3, then the number smaller are in `$c[-1]`

OR `$c[2]`

, the number the same are in `$c[0]`

.

So we just need to output the list of numbers starting at `$c[2]`

of length `$c[0]`

…

#### challenge-263-task-1 - perl

`sub target_index {`

my( $k, @c ) = ( pop, 0, 0, 0 );

$c[ $_ <=> $k ]++ for @_;

$c[2] .. $c[2] + $c[0] - 1

}

Spaceship operator `<=>`

returns values -1,0,1 depending on the sign of the difference.

## Task #2: Merge Items

You are given two 2-D array of positive integers, `$items1`

and `$items2`

where element is pair of (`item_id`

, `item_quantity`

).

Write a script to return the merged items.

**Example 1**

Input: $items1 = [ [1,1], [2,1], [3,2] ] $items2 = [ [2,2], [1,3] ] Output: [ [1,4], [2,3], [3,2] ]

**Example 2**

Input: $items1 = [ [1,2], [2,3], [1,3], [3,2] ] $items2 = [ [3,1], [1,3] ] Output: [ [1,8], [2,3], [3,3] ]

**Example 3**

Input: $items1 = [ [1,1], [2,2], [3,3] ] $items2 = [ [2,3], [2,4] ] Output: [ [1,1], [2,9], [3,3] ]

## Solution

We don’t need to know which group the count is from – in fact the code below works if you have 1, 2, 3 or even 100 lists.

We loop through every pair in every list updating the count for the key…

We code simplify the code to use:

`$code{ $_->[0] } += $_->[1] for map { @{$_} } @_;`

but this could have memory issues as you have to create a new array and loop over it. So we use two loops instead. One example of where code golf can cause a major inefficiency.

We store the values of the hash and return the keys and values as a list of pairs rather than the normal hash structure.

#### challenge-263-task-2 - perl

`sub merge_items {`

my %c;

for( @_ ) {

$c{ $_->[0] } += $_->[1] for @{$_}

}

map { [ 0 + $_ => $c{$_} ] } keys %c

}

Note we add 0 to the key value to cast as a number.

## About The Weekly Challenge

The weekly challenge was set up Mohammad Anwar approximately 5 years ago - each Monday two problems are set for the "team" to solve.

These are posted at: