Robbie Hatley's Solutions To The Weekly Challenge #263
For those not familiar with "The Weekly Challenge", it is a weekly programming puzzle with two parts, cycling every Sunday. You can find it here:
This week (2024-03-31 through 2024-04-06) is weekly challenge #263. Its tasks are as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Task 263-1: Target Index Submitted by: Mohammad Sajid Anwar You are given an array of integers @ints 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 $ints[2] = 2 Example 2: Input: @ints = (1, 2, 4, 3, 5), $k = 6 Output: () No element in the given array matching the given target. Example 3: Input: @ints = (5, 3, 2, 4, 2, 1), $k = 4 Output: (4) Sorted array: (1, 2, 2, 3, 4, 5) Target index: (4) as $ints[4] = 4
Function "indexes" from CPAN module "List::MoreUtils" solves this easily:
use v5.38; use List::MoreUtils 'indexes'; sub indices ($target, @array) { # Return those indices of the sorted array # for which the value equals the target: return indexes {$_ == $target} sort {$a <=> $b} @array; }
Robbie Hatley's Perl Solution to The Weekly Challenge 263-1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Task 263-2: Merge Items Submitted by: Mohammad Sajid Anwar 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] ] Item id (1) appears 2 times: [1,1] and [1,3]. Merged item now (1,4) Item id (2) appears 2 times: [2,1] and [2,2]. Merged item now (2,3) Item id (3) appears 1 time: [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] ]
I'll make a hash with keys being "item_id" and values being "item_quanity". For each pair, I'll increment the value of key "item_id" by amount "item_quantity":
use v5.38; sub merge_items (@lists) { # Make a hash of quantities keyed by id: my %items; # For each item (that is, for each (id,quantity) pair) in each list, # add its quantity to the quantity for the corresponding id in the hash: foreach my $list (@lists) { foreach my $item (@$list) { $items{$$item[0]} += $$item[1]; } } # Finally, return a list of all (id,quantity) pairs from the hash, # sorted by the numeric values of the keys: return map {[$_,$items{$_}]} sort {$a <=> $b} keys %items; }
Robbie Hatley's Perl Solution to The Weekly Challenge 263-2
That's it for challenge 263; see you on challenge 264!
Comments
Post a Comment