Robbie Hatley's Solutions To The Weekly Challenge #279
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:
The Weekly Challenge for the week of 2024-07-21 through 2024-07-27 is #279. Its tasks are as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Task 279-1: Sort Letters
Submitted by: Mohammad Sajid Anwar
Given two arrays, @letters and @weights, write a script to sort
@letters based on @weights.
Example 1:
Input: @letters = ('R', 'E', 'P', 'L')
       @weights = (3, 2, 1, 4)
Output: PERL
Example 2:
Input: @letters = ('A', 'U', 'R', 'K')
       @weights = (2, 4, 1, 3)
Output: RAKU
Example 3:
Input: @letters = ('O', 'H', 'Y', 'N', 'P', 'T')
       @weights = (5, 4, 2, 6, 1, 3)
Output: PYTHON
I use List::MoreUtils::Zip6 to make a list of [letter, weight] pairs, sort those pairs by weight, then return a join of the letters of the sorted list:
   use v5.36;
   use List::MoreUtils 'zip6';
   sub sort_letters ($letters, $weights) {
      join '',
      map {$$_[0]}
      sort {$$a[1]<=>$$b[1]}
      zip6 @$letters, @$weights;
   }
Robbie Hatley's Perl Solution to The Weekly Challenge 279-1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Task 279-2: Split String Submitted by: Mohammad Sajid Anwar Given a string $str, write a script to split $str into two strings, each containing exactly same number of vowels. Return true if you can, otherwise return false. Example 1: Input: $str = "perl" Ouput: false Example 2: Input: $str = "book" Ouput: true Example 3 Input: $str = "good morning" Ouput: true
I don't even bother actually splitting strings, since we're only interested in whether the number of vowels is even. So I make two subs, "count_vowels" and "can_split", which do as their names suggest. The only tricky part is defining what a "vowel" is. For the purposes of this exercise I'll define a "vowel" to be any of [aeiouAEIOU] with-or-without combining marks.:
   use v5.36;
   use Unicode::Normalize 'NFD';
   sub count_vowels ($string) {scalar map {$_} NFD($string) =~ m/[aeiouAEIOU]/g}
   sub can_split ($string) {(0==count_vowels($string)%2)?"true":"false"}
Robbie Hatley's Perl Solution to The Weekly Challenge 279-2
That's it for challenge 279; see you on challenge 280!
Comments
Post a Comment