Peter’s blog ✴ Week 279 ✴ 22 July 2024
THE WEEKLY CHALLENGE
Scrambled and split
You are given two arrays, @letters and @weights.
Write a script to sort the given array @letters based on the @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
Inspection of the examples reveals that:
sorted[weights[j]] = letters[j]
And allowing for Perl's zero-based arrays that is exactly my solution.
I could have made it strictly one line by using @_ directly
rather than copying the arguments of the subroutine into local arrays,
but
$sorted[$_[1]->[$_] - 1] = $_[0]->[$_]
for 0 .. @{$_[0]} - 1;
is not very easy to read (but it does work).
Nice hack to get split string task with nice explanation. Well done.
This review may cover either or both challenges for this week.
#!/usr/bin/perl # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge use v5.26; # The Weekly Challenge - 2024-07-22 use utf8; # Week 279 - task 1 - Sort letters use warnings; # Peter Campbell Smith binmode STDOUT, ':utf8'; sort_letters(['R', 'E', 'P', 'L'], [3, 2, 1, 4]); sort_letters(['A', 'U', 'R', 'K'], [2, 4, 1, 3]); sort_letters(['a', 'C', 'e', 'e', 'g', 'h', 'l', 'l', 'n'], [3, 1, 6, 9, 8, 2, 4, 5, 7]); sub sort_letters { my (@letters, @weights, @sorted); @letters = @{$_[0]}; @weights = @{$_[1]}; # rearrange the letters $sorted[$weights[$_] - 1] = $letters[$_] for 0 .. @letters - 1; printf(qq[\nInput: \@letters = ('%s'), \@weights = (%s)\n], join(qq[', '], @letters), join(', ', @weights)); printf(qq[Output: %s\n], join('', @sorted)); }
7 lines of code
Input: @letters = ('R', 'E', 'P', 'L'), @weights = (3, 2, 1, 4) Output: PERL Input: @letters = ('A', 'U', 'R', 'K'), @weights = (2, 4, 1, 3) Output: RAKU Input: @letters = ('a', 'C', 'e', 'e', 'g', 'h', 'l', 'l', 'n'), @weights = (3, 1, 6, 9, 8, 2, 4, 5, 7) Output: Challenge
Any content of this website which has been created by Peter Campbell Smith is in the public domain