From e8d2e5b7e357b99de3c8eca848c7a4b0de14aa49 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Mon, 26 Jul 2021 21:02:52 +0000 Subject: Task 1 & 2 --- challenge-123/perlboy1967/perl/ch-1.pl | 67 ++++++++++++++++++++++++++++++++++ challenge-123/perlboy1967/perl/ch-2.pl | 44 ++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100755 challenge-123/perlboy1967/perl/ch-1.pl create mode 100755 challenge-123/perlboy1967/perl/ch-2.pl diff --git a/challenge-123/perlboy1967/perl/ch-1.pl b/challenge-123/perlboy1967/perl/ch-1.pl new file mode 100755 index 0000000000..d00b756dcd --- /dev/null +++ b/challenge-123/perlboy1967/perl/ch-1.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl + +# Perl Weekly Challenge - 123 +# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-123/#TASK1 +# +# Task 1 - Ugly Numbers +# +# Author: Niels 'PerlBoy' van Dijke + +use v5.16; +use strict; +use warnings; + +use List::Util qw(min); + +use Test::More; + +# Prototype(s) +sub uglyNumberN($); + + +my $tests = [ + [ 1, 1 ], + [ 2, 2 ], + [ 3, 3 ], + [ 4, 4 ], + [ 5, 5 ], + [ 6, 6 ], + [ 6, 6 ], + [ 7, 8 ], + [ 9, 10], + [ 10, 12], + [100, 1536], +]; + +foreach my $t (@$tests) { + is(uglyNumberN($t->[0]),$t->[1]); +} + +done_testing(); + +# +# Blatenly 'borrowed' solution using Dynamic Programming from: +# https://www.codesdope.com/blog/article/ugly-numbers/ +# +sub uglyNumberN($) { + my ($n) = @_; + + my @uN = (1); + + # indices for multiples of 2,3,5 respectively + my ($u2, $u3, $u5) = (0,0,0); + + # initial multiple value + my ($m2, $m3, $m5) = (2,3,5); + + for my $i (1 .. $n - 1) { + $uN[$i] = min($m2, $m3, $m5); + + $m2 = $uN[++$u2] * 2 if ($uN[$i] == $m2); + $m3 = $uN[++$u3] * 3 if ($uN[$i] == $m3); + $m5 = $uN[++$u5] * 5 if ($uN[$i] == $m5); + } + + return $uN[$n-1]; +} + diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl new file mode 100755 index 0000000000..78078b1f85 --- /dev/null +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl + +# Perl Weekly Challenge - 123 +# - https://perlweeklychallenge.org/blog/perl-weekly-challenge-123/#TASK2 +# +# Task 1 - Square Points +# +# Author: Niels 'PerlBoy' van Dijke + +use v5.16; +use strict; +use warnings; + +use List::MoreUtils qw(frequency); + +use Test::More; + +# Prototype(s) +sub areSquarePoints(\@); + + +my $tests = [ + [ [10,20],[20,20],[20,10],[10,10], 1 ], + [ [12,24],[16,10],[20,12],[18,16], 0 ], + [ [10,24],[12,24],[10,12],[18,16], 0 ], + [ [20,20],[20,10],[10,10],[10,20], 1 ], +]; + +foreach my $t (@$tests) { + my $res = pop(@$t); + is(areSquarePoints(@$t),$res); +} + +done_testing(); + + +sub areSquarePoints(\@) { + my ($ar) = @_; + + my %xF = frequency map {$_->[0]} @$ar; + my %yF = frequency map {$_->[1]} @$ar; + + return (scalar(keys %xF) == 2 && scalar(keys %yF) == 2 ? 1: 0); +} -- cgit From 176d3cd72a280e82fcd32a3a68039dc654b12e99 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Mon, 26 Jul 2021 21:34:59 +0000 Subject: Task is about squares dX must be equal to dY --- challenge-123/perlboy1967/perl/ch-2.pl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index 78078b1f85..89046a2c56 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -11,7 +11,8 @@ use v5.16; use strict; use warnings; -use List::MoreUtils qw(frequency); +use List::MoreUtils qw(frequency slide); +use Data::Printer; use Test::More; @@ -40,5 +41,12 @@ sub areSquarePoints(\@) { my %xF = frequency map {$_->[0]} @$ar; my %yF = frequency map {$_->[1]} @$ar; - return (scalar(keys %xF) == 2 && scalar(keys %yF) == 2 ? 1: 0); + my @xV = sort { $b <=> $a } keys %xF; + my @yV = sort { $b <=> $a } keys %yF; + + return 1 if (scalar(@xV) == 2 and + scalar(@yV) == 2 and + $xV[0]-$xV[1] == $yV[0]-$yV[1]); + + return 0; } -- cgit From 7d3cd6a3cba67f5350be24ded85998f65741ee20 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Mon, 26 Jul 2021 21:39:41 +0000 Subject: Little typo fixes and cleanup --- challenge-123/perlboy1967/perl/ch-1.pl | 2 +- challenge-123/perlboy1967/perl/ch-2.pl | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/challenge-123/perlboy1967/perl/ch-1.pl b/challenge-123/perlboy1967/perl/ch-1.pl index d00b756dcd..4789edf5cb 100755 --- a/challenge-123/perlboy1967/perl/ch-1.pl +++ b/challenge-123/perlboy1967/perl/ch-1.pl @@ -40,7 +40,7 @@ foreach my $t (@$tests) { done_testing(); # -# Blatenly 'borrowed' solution using Dynamic Programming from: +# Blatently 'borrowed' solution using Dynamic Programming from: # https://www.codesdope.com/blog/article/ugly-numbers/ # sub uglyNumberN($) { diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index 89046a2c56..2b8d16136d 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -11,8 +11,7 @@ use v5.16; use strict; use warnings; -use List::MoreUtils qw(frequency slide); -use Data::Printer; +use List::MoreUtils qw(frequency); use Test::More; -- cgit From 9ee9683f6bd9f7e19fa3d4859ad9c54afcaa7b47 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 27 Jul 2021 09:40:52 +0000 Subject: Task 1 --- challenge-123/perlboy1967/perl/ch-1.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/challenge-123/perlboy1967/perl/ch-1.pl b/challenge-123/perlboy1967/perl/ch-1.pl index 4789edf5cb..817161e3f1 100755 --- a/challenge-123/perlboy1967/perl/ch-1.pl +++ b/challenge-123/perlboy1967/perl/ch-1.pl @@ -39,6 +39,7 @@ foreach my $t (@$tests) { done_testing(); + # # Blatently 'borrowed' solution using Dynamic Programming from: # https://www.codesdope.com/blog/article/ugly-numbers/ -- cgit From 5f22259b0ad9138417e7a89f698d619f21230dfb Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 27 Jul 2021 10:25:17 +0000 Subject: Task 2 Overlooked rotated squares earlier. Fixed. --- challenge-123/perlboy1967/perl/ch-2.pl | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index 2b8d16136d..4566e93685 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -11,12 +11,14 @@ use v5.16; use strict; use warnings; -use List::MoreUtils qw(frequency); +use List::MoreUtils qw(frequency arrayify); +use Data::Printer; use Test::More; # Prototype(s) sub areSquarePoints(\@); +sub dist(\@\@); my $tests = [ @@ -24,6 +26,7 @@ my $tests = [ [ [12,24],[16,10],[20,12],[18,16], 0 ], [ [10,24],[12,24],[10,12],[18,16], 0 ], [ [20,20],[20,10],[10,10],[10,20], 1 ], + [ [ 0, 1],[ 1, 2],[ 2, 1],[ 1, 0], 1 ], ]; foreach my $t (@$tests) { @@ -37,15 +40,28 @@ done_testing(); sub areSquarePoints(\@) { my ($ar) = @_; - my %xF = frequency map {$_->[0]} @$ar; - my %yF = frequency map {$_->[1]} @$ar; + my @dP; - my @xV = sort { $b <=> $a } keys %xF; - my @yV = sort { $b <=> $a } keys %yF; + # If all points given are coordinates of a square + # then the distance between one point and the other three + # will give 2 identical and on other + foreach my $i (0 .. 3) { + my @d; + foreach my $j (0 .. 3) { + next if ($i == $j); + push(@d,sqrt(($ar->[$i][0]-$ar->[$j][0])**2 + + ($ar->[$i][1]-$ar->[$j][1])**2)); + } + my %f = frequency @d; + push(@dP,[keys %f]); + } - return 1 if (scalar(@xV) == 2 and - scalar(@yV) == 2 and - $xV[0]-$xV[1] == $yV[0]-$yV[1]); + # If all four points give same distance 'frequencies' + # then we have a square + my %f = frequency arrayify @dP; + + return 1 if (scalar keys %f == 2); return 0; } + -- cgit From d521af3815a314d0df014f70d56081ead39494b6 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 27 Jul 2021 10:33:06 +0000 Subject: Some debug and other cleanup --- challenge-123/perlboy1967/perl/ch-2.pl | 2 -- 1 file changed, 2 deletions(-) diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index 4566e93685..baad19940c 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -12,13 +12,11 @@ use strict; use warnings; use List::MoreUtils qw(frequency arrayify); -use Data::Printer; use Test::More; # Prototype(s) sub areSquarePoints(\@); -sub dist(\@\@); my $tests = [ -- cgit From 77f383560a0debd285805be0c6394db730024e05 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 27 Jul 2021 10:53:24 +0000 Subject: Task 2: Added rhombus (5 x 1) to test suite Thanks for the suggestion James Curtis-Smith --- challenge-123/perlboy1967/perl/ch-2.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index baad19940c..75e2544d1c 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -12,11 +12,13 @@ use strict; use warnings; use List::MoreUtils qw(frequency arrayify); +use Data::Printer; use Test::More; # Prototype(s) sub areSquarePoints(\@); +sub dist(\@\@); my $tests = [ @@ -25,6 +27,7 @@ my $tests = [ [ [10,24],[12,24],[10,12],[18,16], 0 ], [ [20,20],[20,10],[10,10],[10,20], 1 ], [ [ 0, 1],[ 1, 2],[ 2, 1],[ 1, 0], 1 ], + [ [-5, 0],[ 5, 0],[ 0, 1],[ 0,-1], 0 ], ]; foreach my $t (@$tests) { -- cgit From 5746a8d5a6437903f87f33b2202eddc7988a7f72 Mon Sep 17 00:00:00 2001 From: Niels van Dijke Date: Tue, 27 Jul 2021 11:19:03 +0000 Subject: Ditch the arrayify usage --- challenge-123/perlboy1967/perl/ch-2.pl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/challenge-123/perlboy1967/perl/ch-2.pl b/challenge-123/perlboy1967/perl/ch-2.pl index 75e2544d1c..cabec1e3e8 100755 --- a/challenge-123/perlboy1967/perl/ch-2.pl +++ b/challenge-123/perlboy1967/perl/ch-2.pl @@ -11,14 +11,12 @@ use v5.16; use strict; use warnings; -use List::MoreUtils qw(frequency arrayify); -use Data::Printer; +use List::MoreUtils qw(frequency); use Test::More; # Prototype(s) sub areSquarePoints(\@); -sub dist(\@\@); my $tests = [ @@ -28,6 +26,7 @@ my $tests = [ [ [20,20],[20,10],[10,10],[10,20], 1 ], [ [ 0, 1],[ 1, 2],[ 2, 1],[ 1, 0], 1 ], [ [-5, 0],[ 5, 0],[ 0, 1],[ 0,-1], 0 ], + [ [-1, 0],[ 5, 0],[ 0, 1],[ 0,-1], 0 ], ]; foreach my $t (@$tests) { @@ -54,12 +53,12 @@ sub areSquarePoints(\@) { ($ar->[$i][1]-$ar->[$j][1])**2)); } my %f = frequency @d; - push(@dP,[keys %f]); + push(@dP,keys %f); } # If all four points give same distance 'frequencies' # then we have a square - my %f = frequency arrayify @dP; + my %f = frequency @dP; return 1 if (scalar keys %f == 2); -- cgit