From fc5c287f17198bc9f1959e9407db8dcc96aa73e4 Mon Sep 17 00:00:00 2001 From: Flavio Poletti Date: Fri, 27 Nov 2020 10:13:40 +0100 Subject: Add polettix's solution to PWC088 --- challenge-088/polettix/blog.txt | 1 + challenge-088/polettix/blog1.txt | 1 + challenge-088/polettix/perl/ch-1.pl | 31 +++++++++++++++++ challenge-088/polettix/perl/ch-2.pl | 66 +++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 challenge-088/polettix/blog.txt create mode 100644 challenge-088/polettix/blog1.txt create mode 100644 challenge-088/polettix/perl/ch-1.pl create mode 100644 challenge-088/polettix/perl/ch-2.pl 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 ] -- cgit