diff options
| -rwxr-xr-x | challenge-123/perlboy1967/perl/ch-1.pl | 67 | ||||
| -rwxr-xr-x | challenge-123/perlboy1967/perl/ch-2.pl | 44 |
2 files changed, 111 insertions, 0 deletions
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); +} |
