aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-089/jcrosswh/README1
-rw-r--r--challenge-089/jcrosswh/perl/ch-1.pl69
-rw-r--r--challenge-089/jcrosswh/perl/ch-2.pl72
3 files changed, 142 insertions, 0 deletions
diff --git a/challenge-089/jcrosswh/README b/challenge-089/jcrosswh/README
new file mode 100644
index 0000000000..144afd1a18
--- /dev/null
+++ b/challenge-089/jcrosswh/README
@@ -0,0 +1 @@
+Solution by Joel Crosswhite. \ No newline at end of file
diff --git a/challenge-089/jcrosswh/perl/ch-1.pl b/challenge-089/jcrosswh/perl/ch-1.pl
new file mode 100644
index 0000000000..c23100948e
--- /dev/null
+++ b/challenge-089/jcrosswh/perl/ch-1.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+=head1 NAME
+
+PWC 089 Challenge 1
+
+=head1 SYNOPSIS
+
+ $ ch-1.pl 3
+ 3
+
+ $ ch-1.pl 4
+ 7
+
+=head1 DESCRIPTION
+
+Given a positive integer, this script will sum the
+L<GCD|https://en.wikipedia.org/wiki/Greatest_common_divisor> of all possible
+unique pairs between 1 and the inputed positive integer.
+
+=head1 SOLUTION
+
+This solution uses the
+L<Binary GCD algorithm|https://en.wikipedia.org/wiki/Binary_GCD_algorithm> to
+determine the different GCD values.
+
+=head1 AUTHORS
+
+Joel Crosswhite E<lt>joel.crosswhite@ix.netcom.comE<gt>
+
+=cut
+
+my $input = $ARGV[0];
+if (!defined($input) || $input !~ m/^[1-9]\d*$/) {
+ print "Usage: ch-1.pl <positive integer>\n";
+ exit 1;
+}
+
+my $retval = 0;
+for (my $i = 1; $i < $input; $i++) {
+ for (my $k = $i + 1; $k <= $input; $k++) {
+ $retval += gcd($i, $k);
+ }
+}
+
+print $retval . "\n";
+exit 0;
+
+sub gcd {
+ my ($first, $second, $d) = @_;
+ $d = 0 if !defined($d);
+
+ if ($first == $second) {
+ return $first * 2 ** $d;
+ } elsif ($first % 2 == 0 && $second % 2 == 0) {
+ return gcd($first / 2, $second / 2, $d + 1);
+ } elsif ($first % 2 == 0) {
+ return gcd($first / 2, $second, $d);
+ } elsif ($second % 2 ==0) {
+ return gcd($first, $second / 2, $d);
+ } else {
+ my $c = abs($first - $second);
+ my $new_second = $first < $second ? $first : $second;
+ return gcd($c / 2, $new_second, $d);
+ }
+}# gcd
diff --git a/challenge-089/jcrosswh/perl/ch-2.pl b/challenge-089/jcrosswh/perl/ch-2.pl
new file mode 100644
index 0000000000..349f43d523
--- /dev/null
+++ b/challenge-089/jcrosswh/perl/ch-2.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+=head1 NAME
+
+PWC 089 Challenge 2
+
+=head1 SYNOPSIS
+
+ $ ch-2.pl
+ [ a b c ]
+ [ d e f ]
+ [ g h i ]
+
+=head1 DESCRIPTION
+
+A script to display matrix as below with numbers 1 - 9.
+
+ [ a b c ]
+ [ d e f ]
+ [ g h i ]
+
+The matrix will satisfy the following rules:
+
+ a + b + c = 15
+ d + e + f = 15
+ g + h + i = 15
+ a + d + g = 15
+ b + e + h = 15
+ c + f + i = 15
+ a + e + i = 15
+ c + e + g = 15
+
+The numbers will only be used once.
+
+=head1 SOLUTION
+
+This solution uses the
+L<Siamese method|https://en.wikipedia.org/wiki/Siamese_method> to populate and
+print the array.
+
+=head1 AUTHORS
+
+Joel Crosswhite E<lt>joel.crosswhite@ix.netcom.comE<gt>
+
+=cut
+
+my @matrix;
+my $LENGTH = 3;
+my @location = (0, int($LENGTH / 2));
+my $value = 1;
+my $max_value = $LENGTH * $LENGTH + 1;
+
+while ($value < $max_value) {
+
+ if (!defined($matrix[$location[0]][$location[1]])) {
+ $matrix[$location[0]][$location[1]] = $value++;
+ $location[0] = ($location[0] - 1) % $LENGTH;
+ $location[1] = ($location[1] + 1) % $LENGTH;
+ } else {
+ $location[0] = ((($location[0] + 1) % $LENGTH) + 1) % $LENGTH;
+ $location[1] = ($location[1] - 1) % $LENGTH;
+ }
+}
+
+foreach my $line (@matrix) {
+ printf("[ %d %d %d ]\n", $line->[0], $line->[1], $line->[2]);
+}
+
+exit 0;