aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2021-11-26 18:31:41 +0100
committerAlexander Pankoff <ccntrq@screenri.de>2021-11-26 18:31:41 +0100
commiteb542331dece11bdd537961e3773df6ccb794e59 (patch)
tree4c7d58ed6a2dc4e4a4a407cde0642e8cf18648e2
parentf689e98205eb99b05d49063e5b2b2eccbaca945a (diff)
downloadperlweeklychallenge-club-eb542331dece11bdd537961e3773df6ccb794e59.tar.gz
perlweeklychallenge-club-eb542331dece11bdd537961e3773df6ccb794e59.tar.bz2
perlweeklychallenge-club-eb542331dece11bdd537961e3773df6ccb794e59.zip
Add implementation for challenge 140 task 02
-rw-r--r--challenge-140/alexander-pankoff/perl/ch-2.pl80
1 files changed, 80 insertions, 0 deletions
diff --git a/challenge-140/alexander-pankoff/perl/ch-2.pl b/challenge-140/alexander-pankoff/perl/ch-2.pl
new file mode 100644
index 0000000000..b0cb877ed5
--- /dev/null
+++ b/challenge-140/alexander-pankoff/perl/ch-2.pl
@@ -0,0 +1,80 @@
+use strict;
+use warnings;
+use feature qw'say signatures';
+no warnings 'experimental::signatures';
+
+use constant DEBUG => $ENV{DEBUG} // 0;
+
+run() unless caller();
+
+sub run() {
+ my $i = prompt_for_integer('i');
+ my $j = prompt_for_integer('j');
+ my $k = prompt_for_integer('k');
+
+ my $matrix = multiplication_matrix( $i, $j );
+ my @sorted_matrix = sort_multiplication_matrix($matrix);
+ my $res = $sorted_matrix[ $k - 1 ];
+
+ if (DEBUG) {
+ say "Since the multiplication of $i x $j is as below:";
+
+ say render_matrix($matrix);
+ say "The sorted multiplication table:";
+ say join( ' ', @sorted_matrix );
+
+ say "Now the " . to_ordinal($k) . " element in the table is '$res'";
+
+ }
+
+ say $res;
+
+}
+
+sub multiplication_matrix ( $i, $j ) {
+ [
+ map {
+ my $row = $_;
+ [
+ map {
+ my $col = $_;
+ $col * $row;
+
+ } ( 1 .. $j )
+ ];
+ } ( 1 .. $i )
+ ];
+}
+
+sub sort_multiplication_matrix($matrix) {
+ sort { $a <=> $b } map { @$_ } @$matrix;
+}
+
+sub render_matrix($matrix) {
+ my $max = $matrix->[-1][-1];
+ my $width = length $max;
+ my $format_str = "%$width" . 'd';
+
+ join(
+ "\n",
+ map {
+ join( " ", map { sprintf( $format_str, $_ ) } @$_ )
+ } @$matrix
+ );
+}
+
+sub to_ordinal($n) {
+ return ( $n == 1 ) ? "1st" : $n == 2 ? "2nd" : $n == 3 ? "3rd" : $n . 'th';
+}
+
+sub prompt_for_integer($name) {
+ say "Enter integer number $name greater or equal to 1.";
+ chomp( my $number = <STDIN> );
+
+ if ( $number !~ m/^\d+$/ || $number < 1 ) {
+ say "Invalid integer.";
+ return prompt_for_integer($name);
+ }
+
+ return $number;
+}