aboutsummaryrefslogtreecommitdiff
path: root/challenge-088/polettix
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2020-11-27 10:13:40 +0100
committerFlavio Poletti <flavio@polettix.it>2020-11-27 10:13:40 +0100
commitfc5c287f17198bc9f1959e9407db8dcc96aa73e4 (patch)
tree175848fdcc3c5812f427f8eeba7ef51f37486ccb /challenge-088/polettix
parent349bed1114462cf172825e17ac081c9e08549b80 (diff)
downloadperlweeklychallenge-club-fc5c287f17198bc9f1959e9407db8dcc96aa73e4.tar.gz
perlweeklychallenge-club-fc5c287f17198bc9f1959e9407db8dcc96aa73e4.tar.bz2
perlweeklychallenge-club-fc5c287f17198bc9f1959e9407db8dcc96aa73e4.zip
Add polettix's solution to PWC088
Diffstat (limited to 'challenge-088/polettix')
-rw-r--r--challenge-088/polettix/blog.txt1
-rw-r--r--challenge-088/polettix/blog1.txt1
-rw-r--r--challenge-088/polettix/perl/ch-1.pl31
-rw-r--r--challenge-088/polettix/perl/ch-2.pl66
4 files changed, 99 insertions, 0 deletions
diff --git a/challenge-088/polettix/blog.txt b/challenge-088/polettix/blog.txt
new file mode 100644
index 0000000000..8a2fd7447f
--- /dev/null
+++ b/challenge-088/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/11/26/pwc088-array-of-product/
diff --git a/challenge-088/polettix/blog1.txt b/challenge-088/polettix/blog1.txt
new file mode 100644
index 0000000000..13daafdcde
--- /dev/null
+++ b/challenge-088/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/11/27/pwc088-spiral-matrix/
diff --git a/challenge-088/polettix/perl/ch-1.pl b/challenge-088/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..23dac15715
--- /dev/null
+++ b/challenge-088/polettix/perl/ch-1.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub array_of_product (@N) {
+ my $p = 1;
+ $p *= $_ for @N[0 .. $#N - 1];
+ return map {$p = $N[$_ - 1] * ($p / $N[$_]) } 0 .. $#N;
+}
+
+sub array_of_product_sloppy (@N) {
+ return map {
+ my $p = 1;
+ $p *= $_ for @N[0 .. $_ - 1, $_ + 1 .. $#N];
+ $p;
+ } 0 .. $#N;
+}
+
+sub array_of_product_overflowing (@N) {
+ my $p = 1;
+ $p *= $_ for @N;
+ return map {$p / $_ } @N;
+}
+
+sub print_array (@A) { local $" = ', '; say "(@A)" }
+
+print_array(array_of_product(@ARGV ? @ARGV : (5, 2, 1, 4, 3)));
+print_array(array_of_product_sloppy(@ARGV ? @ARGV : (5, 2, 1, 4, 3)));
+print_array(array_of_product_overflowing(@ARGV ? @ARGV : (5, 2, 1, 4, 3)));
diff --git a/challenge-088/polettix/perl/ch-2.pl b/challenge-088/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..ee46e06e0d
--- /dev/null
+++ b/challenge-088/polettix/perl/ch-2.pl
@@ -0,0 +1,66 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+$|++;
+
+sub get_row ($M, $r, $c, $n) { $M->[$r]->@[$c .. $c + $n - 1] }
+sub get_col ($M, $r, $c, $n) { map { $M->[$r + $_][$c] } 0 .. $n - 1 }
+sub get_frame ($M, $r, $c, $nr, $nc) {
+ ($nr, $nc) = ($nr - 1, $nc - 1); # more useful like this
+ return (
+ get_row( $M, $r , $c , $nc),
+ get_col( $M, $r , $c + $nc, $nr),
+ reverse(get_row($M, $r + $nr, $c + 1, $nc)),
+ reverse(get_col($M, $r + 1, $c , $nr)),
+ );
+}
+
+sub spiral_matrix ($M) {
+ my ($rows, $cols) = (scalar($M->@*), scalar($M->[0]->@*));
+ my ($sr, $sc) = (0, 0);
+ my @v;
+ while ($rows > 0 && $cols > 0) {
+ if ($rows == 1) { push @v, get_row($M, $sr, $sc, $cols) }
+ elsif ($cols == 1) { push @v, get_col($M, $sr, $sc, $rows) }
+ else { push @v, get_frame($M, $sr, $sc, $rows, $cols) }
+ ($sr, $sc, $rows, $cols) = ($sr + 1, $sc + 1, $rows - 2, $cols - 2);
+ }
+ return @v;
+}
+
+sub read_matrix ($fh) {
+ local $/ = ''; # read by "paragraph"
+ my $text = <$fh> or return;
+ return [ map { [grep /\d/, split m{\D+}mxs] } split m{\n+}mxs, $text ];
+}
+
+sub print_matrix ($fh, $M) {
+ say {$fh} '[ ', join(', ', map {sprintf '%3d', $_} $_->@*), ' ]'
+ for $M->@*;
+ return;
+}
+
+while (my $M = read_matrix(\*DATA)) {
+ print_matrix(\*STDERR, $M);
+ say '[ ', join(', ', spiral_matrix($M)), ' ]';
+}
+
+__END__
+[ 1, 2, 3, 4 ]
+[ 5, 6, 7, 8 ]
+[ 9, 10, 11, 12 ]
+[ 13, 14, 15, 16 ]
+
+[ 1, 2, 3 ]
+[ 4, 5, 6 ]
+[ 7, 8, 9 ]
+
+[ 1, 2, 3 ]
+[ 4, 5, 6 ]
+
+[ 1, 2, 3, 4 ]
+[ 5, 6, 7, 8 ]
+[ 9, 10, 11, 12 ]