Robbie Hatley's Solutions To The Weekly Challenge #253
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-01-21 through 2024-01-27) is weekly challenge #253. Its tasks are as follows:
Task 253-1: Split Strings Submitted by: Mohammad S Anwar You are given an array of strings and a character separator. Write a script to return all words separated by the given character excluding empty string. Example 1: Input: @words = ("one.two.three","four.five","six") $separator = "." Output: "one","two","three","four","five","six" Example 2: Input: @words = ("$perl$$", "$$raku$") $separator = "$" Output: "perl","raku"
This is just a matter of splitting strings based on the given separator, then dumping the empty strings. One complicating factor, though, is that for separators such as the "." and "$" given in the examples to actually work, they must be stripped of their magical "meta" powers by using the "\Q" de-meta operator. So something like this sub should work:
sub split_strings ($separator, @array) { return grep {length($_)>0} map {split /\Q$separator\E/, $_} @array; }
Robbie Hatley's Perl Solution to The Weekly Challenge 253-1
Task 253-2: Weakest Row Submitted by: Mohammad S Anwar You are given an m x n binary matrix i.e. only 0 and 1 where 1 always appear before 0. A row i is weaker than a row j if one of the following is true: a) The number of 1s in row i is less than the number of 1s in row j. b) Both rows have the same number of 1 and i < j. Write a script to return the order of rows from weakest to strongest. Example 1: Input: $matrix = [ [1, 1, 0, 0, 0], [1, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 1, 0, 0, 0], [1, 1, 1, 1, 1] ] Output: (2, 0, 3, 1, 4) The number of 1s in each row is: - Row 0: 2 - Row 1: 4 - Row 2: 1 - Row 3: 2 - Row 4: 5 Example 2: Input: $matrix = [ [1, 0, 0, 0], [1, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0] ] Output: (0, 2, 3, 1) The number of 1s in each row is: - Row 0: 1 - Row 1: 4 - Row 2: 1 - Row 3: 1
A combined sort can be indicated by PrimarySort || SecondarySort. In this case, the primary sort is by "# of 1s" and secondary sort is by index. The "# of 1s" is just sum0(Row), and the indices are just 0..$#$aref. So this subroutine should do the trick:
sub weakest ($aref) { return sort {sum0(@{$$aref[$a]})<=>sum0(@{$$aref[$b]}) || $a<=>$b} 0..$#$aref; }
Robbie Hatley's Perl Solution to The Weekly Challenge 253-2
That's it for challenge 253; see you on challenge 254!
Comments
Post a Comment