From b915d238533b3bce7af66533d1a8be82c11a1536 Mon Sep 17 00:00:00 2001 From: Simon Green Date: Tue, 27 Jul 2021 22:24:07 +1000 Subject: sgreen solution to challenge 123 --- challenge-123/sgreen/README.md | 4 +-- challenge-123/sgreen/blog.txt | 1 + challenge-123/sgreen/perl/ch-1.pl | 36 +++++++++++++++++++++++++ challenge-123/sgreen/perl/ch-2.pl | 55 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 challenge-123/sgreen/blog.txt create mode 100755 challenge-123/sgreen/perl/ch-1.pl create mode 100755 challenge-123/sgreen/perl/ch-2.pl 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); -- cgit