site.base_url }}/">The Bear's Den -->

The Bear's Den

Enter at your own risk

Neither Sort Nor Split

Task 1: Sort Letters

Submitted by: Mohammad Sajid Anwar


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

Solution

This task is very similar to task #1 from challenge 278 with one significant difference: Now I’ve seen solutions to last week’s challenge that are much better than mine.

I’ll assume the weights to be in the range \(1 \ldots n\) without gaps or repetitions. Then the weights can be used as (one-based) indices in a target array where the source characters are to be placed.

use v5.24;
use warnings;
use experimental 'signatures';

sub sort_letters ($letters, $weights) {
    (\my @word)->@[map $_ - 1, @$weights] = @$letters;
    join '', @word;
}

See the full solution to task 1.

Task 2: Split String

Submitted by: Mohammad Sajid Anwar


You are given a string, $str.

Write a script to split the given string into two containing exactly same number of vowels and return true if you can otherwise false.

Example 1

Input: $str = "perl"
Ouput: false

Example 2

Input: $str = "book"
Ouput: true

Two possible strings "bo" and "ok" containing exactly one vowel each.

Example 3

Input: $str = "good morning"
Ouput: true

Two possible strings "good " and "morning" containing two vowels each or "good m" and "orning" containing two vowels each.

Solution

Here we need to check if the given string contains an even number of vowels. Using the tr/// operator to count them.

use strict;
use warnings;

sub split_string {
    local $_ = shift;

    !(tr/aeiouAEIOU// % 2);
}

See the full solution to task 2.


If you have a question about this post or if you like to comment on it, feel free to open an issue in my github repository.