DEV Community

Simon Green
Simon Green

Posted on

Weekly Challenge 244

Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My solutions are written in Python first, and then converted to Perl. It's a great way for us all to practice some coding.

Challenge, My solutions

Task 1: Count Smaller

Task

You are given an array of integers.

Write a script to calculate the number of integers smaller than the integer at each index.

My solution

This is a one-liner in Python

solution = [sum(1 for j in ints if j < i) for i in ints]
Enter fullscreen mode Exit fullscreen mode

Breaking it down:

  • for i in ints iterates through the supplied list, assigning each value to the variable i.
  • sum(1...) will count the number of elements that satisfy the condition.
  • for j in ints creates an inner loop, assigning each value to the variable 'j'.
  • Finally j < i will only count the elements where the value in the inner loop is lower than the outer loop.

As Perl does not provide an easy way for double loops, I create a separate function to calculate the values less than a number, and then use the map function to iterate through each value.

sub less_than($i, $ints) {
    return scalar( grep { $_ < $i } @$ints );
}

my @solution = map { less_than( $_, \@ints ) } @ints;
Enter fullscreen mode Exit fullscreen mode

Examples

$ ./ch-1.py 8 1 2 2 3
4, 0, 1, 1, 3

$ ./ch-1.py 6 5 4 8
2, 1, 0, 3

$ ./ch-1.py 2 2 2
0, 0, 0
Enter fullscreen mode Exit fullscreen mode

Task 2: Group Hero

Task

You are given an array of integers representing the strength.

Write a script to return the sum of the powers of all possible combinations; power is defined as the square of the largest number in a sequence, multiplied by the smallest.

My solution

For this task, I create a function called calculate_power that returns the square of the largest number multiplied by the smallest number.

def calculate_power(numbers):
    min_int = min(numbers)
    max_int = max(numbers)
    return max_int ** 2 * min_int
Enter fullscreen mode Exit fullscreen mode

In the main function, I create a loop called length which goes from 1 to the length of the supplied list. For each length, I compute all combinations. Thankfully Python has a combination function in itertools.

for length in range(1, len(ints)+1):
    power += sum(calculate_power(c) for c in combinations(ints, length))
Enter fullscreen mode Exit fullscreen mode

Perl's combination function comes from the Algorithm::Combinatorics module.

foreach my $len ( 1 .. $#ints+1) {
    my $iter = combinations(\@ints, $len);
    while (my $c = $iter->next) {
        $power += calculate_power($c);
    }
}

Enter fullscreen mode Exit fullscreen mode

Examples

$ ./ch-2.py 2 1 4
141
Enter fullscreen mode Exit fullscreen mode

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay