## Perl Weekly Challenge 140: Multiplication Tables

These are some answers to the Week 140 of the Perl Weekly Challenge organized by Mohammad S. Anwar.

## Task 1: Add Binary

This task was covered in the following blog post: http://blogs.perl.org/users/laurent_r/2021/11/perl-weekly-challenge-140-add-binary.html.

## Task 2: Multiplication Table

*You are given 3 positive integers, $i, $j and $k.*

*Write a script to print the $kth element in the sorted multiplication table of $i and $j.*

*Example 1:*

```
Input: $i = 2; $j = 3; $k = 4
Output: 3
Since the multiplication of 2 x 3 is as below:
1 2 3
2 4 6
The sorted multiplication table:
1 2 2 3 4 6
Now the 4th element in the table is "3".
```

*Example 2:*

```
Input: $i = 3; $j = 3; $k = 6
Output: 4
Since the multiplication of 3 x 3 is as below:
1 2 3
2 4 6
3 6 9
The sorted multiplication table:
1 2 2 3 3 4 6 6 9
Now the 6th element in the table is "4".
```

### Multiplication Table in Raku

We use the built-in infix `X`

cross-product operator to create all combinations from each range, and combine it with the `*`

multiplication operators to obtain all the products of the multiplication table. Then, we simply sort the values obtained and pick the right one (at index `$k - 1`

). In Raku, we can chain all these operations in just one code-line:

```
use v6;
sub mult-table (UInt $i, UInt $j, UInt $k) {
say (sort 1..$i X* 1..$j)[$k - 1]
}
for (2, 3, 4), (3, 3, 6) -> $a, $b, $c {
mult-table $a, $b, $c;
}
```

This script displays the following output:

```
raku ./mult-table.raku
3
4
```

### Multiplication Table in Perl

Since we don’t have the cross-product operator in Perl, we will simply use two nested `for`

loops to compute the products and store them in the `@products`

array. Then, we sort the values obtained and pick the right one (at index `$k - 1`

).

```
use strict;
use warnings;
use feature "say";
sub mult_table {
my ($c, $d, $k) = @{$_[0]};
my @products;
for my $i (1..$c) {
for my $j (1..$d) {
push @products, $i * $j;
}
}
say +(sort {$a <=> $b} @products)[$k - 1];
}
for my $test ([2, 3, 4], [3, 3, 6]) {
mult_table $test;
}
```

This script displays the following output:

```
$ perl mult-table.pl
3
4
```

## Wrapping up

The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on December 5, 2021. And, please, also spread the word about the Perl Weekly Challenge if you can.

## Leave a comment