aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Green <mail@simon.green>2020-11-23 22:55:06 +1000
committerSimon Green <mail@simon.green>2020-11-23 22:55:06 +1000
commit3294653313ce942a6a1c8677a7ec04ad1db0b438 (patch)
tree2d0dff35ccff2b91cecff3e88a1bd477afee2c01
parentcea83925f87e4bbe52ab8c1ce9a2e1b0f2d86611 (diff)
downloadperlweeklychallenge-club-3294653313ce942a6a1c8677a7ec04ad1db0b438.tar.gz
perlweeklychallenge-club-3294653313ce942a6a1c8677a7ec04ad1db0b438.tar.bz2
perlweeklychallenge-club-3294653313ce942a6a1c8677a7ec04ad1db0b438.zip
sgreen solution to challenge 088
-rw-r--r--challenge-088/sgreen/README.md4
-rw-r--r--challenge-088/sgreen/blog.txt1
-rwxr-xr-xchallenge-088/sgreen/perl/ch-1.pl32
-rwxr-xr-xchallenge-088/sgreen/perl/ch-2.pl64
4 files changed, 99 insertions, 2 deletions
diff --git a/challenge-088/sgreen/README.md b/challenge-088/sgreen/README.md
index 0281dfc367..99bc7be7ad 100644
--- a/challenge-088/sgreen/README.md
+++ b/challenge-088/sgreen/README.md
@@ -1,3 +1,3 @@
-# The Weekly Challenge 087
+# The Weekly Challenge 088
-Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-087-6mjh)
+Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-088-5c5f)
diff --git a/challenge-088/sgreen/blog.txt b/challenge-088/sgreen/blog.txt
new file mode 100644
index 0000000000..54598014fb
--- /dev/null
+++ b/challenge-088/sgreen/blog.txt
@@ -0,0 +1 @@
+https://dev.to/simongreennet/weekly-challenge-088-5c5f
diff --git a/challenge-088/sgreen/perl/ch-1.pl b/challenge-088/sgreen/perl/ch-1.pl
new file mode 100755
index 0000000000..6d6827bdbe
--- /dev/null
+++ b/challenge-088/sgreen/perl/ch-1.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use feature 'say';
+use List::Util qw(product);
+
+sub main {
+ my @N = @_;
+
+ # Check that we have integers
+ die "You must specify one or more integers\n" unless scalar(@N);
+ foreach (@N) {
+ die "The value '$_' does not appear to be a positive integer\n"
+ unless /^\d+$/;
+ }
+
+ # Special case if there is only one number
+ if ( scalar(@N) == 1 ) {
+ say '0';
+ return;
+ }
+
+ # Calculate the product of all numbers
+ my $product = product(@N);
+
+ # The solution for each number is product divided by the number
+ say join ', ', map { $product / $_ } @N;
+}
+
+main(@ARGV);
diff --git a/challenge-088/sgreen/perl/ch-2.pl b/challenge-088/sgreen/perl/ch-2.pl
new file mode 100755
index 0000000000..b21117feeb
--- /dev/null
+++ b/challenge-088/sgreen/perl/ch-2.pl
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+sub main {
+ my @array = ();
+
+ # Process the input
+ foreach (@_) {
+ push @array, [/(\d+)/g];
+ }
+
+ # Sanity check
+ foreach my $row ( 1 .. $#array ) {
+ die "Each row must have the same number of colums\n"
+ if scalar( @{ $array[0] } ) != scalar( @{ $array[$row] } );
+ }
+
+ my $rows = scalar(@array);
+ my $cols = scalar( @{ $array[0] } );
+
+ # Right, down, left and up
+ my @directions = ( [ 0, 1 ], [ 1, 0 ], [ 0, -1 ], [ -1, 0 ] );
+
+ # Map out the values we've used
+ my @used = ( map { [ (0) x $cols ] } ( 1 .. $rows ) );
+
+ # We start at the top left, moving right
+ my $x = 0;
+ my $y = 0;
+ my $direction = 0;
+ my @solutions = ();
+
+ # Loop until we've found all the numbers
+ while ( scalar(@solutions) < $rows * $cols ) {
+ push @solutions, $array[$x][$y];
+ $used[$x][$y] = 1;
+
+ my $next_x = $x + $directions[$direction][0];
+ my $next_y = $y + $directions[$direction][1];
+
+ # If we've reached the bounds of our grid, or found a value
+ # we've already used, we need to switch direction
+ if ( $next_x == $cols
+ or $next_y == $rows
+ or $next_x < 0
+ or $next_y < 0
+ or $used[$next_x][$next_y] )
+ {
+ $direction = ++$direction % 4;
+ $next_x = $x + $directions[$direction][0];
+ $next_y = $y + $directions[$direction][1];
+ }
+
+ $x = $next_x;
+ $y = $next_y;
+ }
+
+ say join ', ', @solutions;
+}
+
+main(@ARGV);