## Perl Weekly Challenge 140: Multiplication Tables

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

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.