aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Green <mail@simon.green>2021-07-27 22:24:07 +1000
committerSimon Green <mail@simon.green>2021-07-27 22:24:07 +1000
commitb915d238533b3bce7af66533d1a8be82c11a1536 (patch)
tree533b136d6b8bef7b63579e36987ba09c5de720fc
parent1b4c6c186f95fe3c8bfe1851e9f2e1ce0bf9f213 (diff)
downloadperlweeklychallenge-club-b915d238533b3bce7af66533d1a8be82c11a1536.tar.gz
perlweeklychallenge-club-b915d238533b3bce7af66533d1a8be82c11a1536.tar.bz2
perlweeklychallenge-club-b915d238533b3bce7af66533d1a8be82c11a1536.zip
sgreen solution to challenge 123
-rw-r--r--challenge-123/sgreen/README.md4
-rw-r--r--challenge-123/sgreen/blog.txt1
-rwxr-xr-xchallenge-123/sgreen/perl/ch-1.pl36
-rwxr-xr-xchallenge-123/sgreen/perl/ch-2.pl55
4 files changed, 94 insertions, 2 deletions
diff --git a/challenge-123/sgreen/README.md b/challenge-123/sgreen/README.md
index 8bdfd69d11..1b1ced64d1 100644
--- a/challenge-123/sgreen/README.md
+++ b/challenge-123/sgreen/README.md
@@ -1,3 +1,3 @@
-# The Weekly Challenge 122
+# The Weekly Challenge 123
-Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-122-4np8)
+Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-123-2flk)
diff --git a/challenge-123/sgreen/blog.txt b/challenge-123/sgreen/blog.txt
new file mode 100644
index 0000000000..d7e6df3d07
--- /dev/null
+++ b/challenge-123/sgreen/blog.txt
@@ -0,0 +1 @@
+https://dev.to/simongreennet/weekly-challenge-123-2flk
diff --git a/challenge-123/sgreen/perl/ch-1.pl b/challenge-123/sgreen/perl/ch-1.pl
new file mode 100755
index 0000000000..9043d758d3
--- /dev/null
+++ b/challenge-123/sgreen/perl/ch-1.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+sub _is_ugly {
+ my $x = shift;
+
+ # Keep dividing by 2, 3 and 5 as long as it leaves no remainder
+ foreach my $d ( 2, 3, 5 ) {
+ while ( $x % $d == 0 ) {
+ $x /= $d;
+ }
+ }
+
+ # If the result is 1, it's an ugly number
+ return $x == 1 ? 1 : 0;
+}
+
+sub main {
+ my $n = shift;
+
+ # Sanity check
+ die "You must provide a postive integer\n" unless defined $n;
+ die "The value '$n' does not appear to be a positive integer\n" unless $n =~ /^[1-9][0-9]*$/;
+
+ my $number = 0;
+ while ($n) {
+ --$n if _is_ugly( ++$number );
+ }
+
+ say $number;
+}
+
+main(@ARGV);
diff --git a/challenge-123/sgreen/perl/ch-2.pl b/challenge-123/sgreen/perl/ch-2.pl
new file mode 100755
index 0000000000..6fcd85b8fc
--- /dev/null
+++ b/challenge-123/sgreen/perl/ch-2.pl
@@ -0,0 +1,55 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+# These constants makes it easier to explain
+use constant X1 => 0;
+use constant Y1 => 1;
+use constant X2 => 2;
+use constant Y2 => 3;
+use constant X3 => 4;
+use constant Y3 => 5;
+use constant X4 => 6;
+use constant Y4 => 7;
+
+sub _distance_between {
+ # Work out the distance between two points
+ my ( $x1, $y1, $x2, $y2 ) = @_;
+ my $delta_x = abs( $x1 - $x2 );
+ my $delta_y = abs( $y1 - $y2 );
+ return sqrt( $delta_x**2 + $delta_y**2 );
+}
+
+sub _is_square {
+ my @values = @_;
+
+ # Get the distance between the first two points
+ my $delta = _distance_between( @values[ X1, Y1, X2, Y2 ] );
+
+ # Make sure each side is of equal length
+ return 0 if _distance_between( @values[ X2, Y2, X3, Y3 ] ) != $delta;
+ return 0 if _distance_between( @values[ X3, Y3, X4, Y4 ] ) != $delta;
+ return 0 if _distance_between( @values[ X4, Y4, X1, Y1 ] ) != $delta;
+
+ # Make sure the two cross angles are also of the same length
+ return 0 if _distance_between( @values[ X1, Y1, X3, Y3 ] ) != _distance_between( @values[ X2, Y2, X4, Y4 ] );
+
+ # It's a square
+ return 1;
+}
+
+sub main {
+ my @values = @_;
+
+ # Sanity check
+ die "You must provide eight numbers\n" unless scalar(@values) == 8;
+ foreach my $x (@values) {
+ die "The value '$x does not appear to be a number\n" unless $x =~ /^-?[0-9]+(?:\.[1-9]+)?$/;
+ }
+
+ say _is_square(@values);
+}
+
+main(@ARGV);