diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2021-11-26 18:31:41 +0100 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2021-11-26 18:31:41 +0100 |
| commit | eb542331dece11bdd537961e3773df6ccb794e59 (patch) | |
| tree | 4c7d58ed6a2dc4e4a4a407cde0642e8cf18648e2 | |
| parent | f689e98205eb99b05d49063e5b2b2eccbaca945a (diff) | |
| download | perlweeklychallenge-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.pl | 80 |
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; +} |
