diff options
| author | Flavio Poletti <flavio@polettix.it> | 2020-11-27 10:13:40 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2020-11-27 10:13:40 +0100 |
| commit | fc5c287f17198bc9f1959e9407db8dcc96aa73e4 (patch) | |
| tree | 175848fdcc3c5812f427f8eeba7ef51f37486ccb /challenge-088/polettix | |
| parent | 349bed1114462cf172825e17ac081c9e08549b80 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-088/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-088/polettix/perl/ch-1.pl | 31 | ||||
| -rw-r--r-- | challenge-088/polettix/perl/ch-2.pl | 66 |
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 ] |
