aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-12-02 07:02:36 +0000
committerGitHub <noreply@github.com>2020-12-02 07:02:36 +0000
commitae849530e182e07ef768d7b000061bcc31135420 (patch)
tree349e598e35633e5d91f4eeb6943b3ed485b1d817
parent209eb60e0895250615dc7697ba6dac9487ff16d9 (diff)
parent3e7f47ddac14117472ea43dddfa15beae5c68bbe (diff)
downloadperlweeklychallenge-club-ae849530e182e07ef768d7b000061bcc31135420.tar.gz
perlweeklychallenge-club-ae849530e182e07ef768d7b000061bcc31135420.tar.bz2
perlweeklychallenge-club-ae849530e182e07ef768d7b000061bcc31135420.zip
Merge pull request #2903 from niceperl/challenge-089
Task 089 implementation in Perl by Miguel Prz
-rw-r--r--challenge-089/miguel-prz/perl/Task089_1.pm28
-rw-r--r--challenge-089/miguel-prz/perl/Task089_2.pm132
-rw-r--r--challenge-089/miguel-prz/perl/ch-1.pl20
-rw-r--r--challenge-089/miguel-prz/perl/ch-2.pl13
4 files changed, 193 insertions, 0 deletions
diff --git a/challenge-089/miguel-prz/perl/Task089_1.pm b/challenge-089/miguel-prz/perl/Task089_1.pm
new file mode 100644
index 0000000000..77fe68a858
--- /dev/null
+++ b/challenge-089/miguel-prz/perl/Task089_1.pm
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+
+# calc GCD Euclid's algorithm
+# https://en.wikipedia.org/wiki/Greatest_common_divisor#Euclid's_algorithm
+
+sub gcd {
+ my ($x, $y) = @_;
+
+ $y ? gcd($y, $x % $y) : $x;
+}
+
+# sum GCD of all possible unique pairs between 1 and $N
+
+sub sum_gcd_unique_pairs {
+ my $N = shift;
+ my $sum = 0;
+
+ for my $i (1 .. $N) {
+ for my $j ($i+1 .. $N) {
+ $sum += gcd($i, $j);
+ }
+ }
+ return $sum;
+}
+
+
+1970;
diff --git a/challenge-089/miguel-prz/perl/Task089_2.pm b/challenge-089/miguel-prz/perl/Task089_2.pm
new file mode 100644
index 0000000000..77e6f433ed
--- /dev/null
+++ b/challenge-089/miguel-prz/perl/Task089_2.pm
@@ -0,0 +1,132 @@
+package Task089_2;
+
+use strict;
+use warnings;
+
+
+=head1 NAME
+
+Task089_2 - TASK 089 #2: Magical Matrix
+
+=head1 SYNOPSIS
+
+Display matrix as below with numbers 1 - 9. Make sure numbers are used once.
+
+ [ a b c ]
+ [ d e f ]
+ [ g h i ]
+
+ 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
+
+=cut
+
+
+# Test the magic rules. A hash ref with a-i keys is required. Returns:
+# 0: a rule failed
+# 1: all rules are ok
+
+sub _check_magic_rules_ {
+ my $matrix = shift;
+
+ return 0 if $matrix->{a} + $matrix->{b} + $matrix->{c} != 15;
+ return 0 if $matrix->{d} + $matrix->{e} + $matrix->{f} != 15;
+ return 0 if $matrix->{g} + $matrix->{h} + $matrix->{i} != 15;
+
+ return 0 if $matrix->{a} + $matrix->{d} + $matrix->{g} != 15;
+ return 0 if $matrix->{b} + $matrix->{e} + $matrix->{h} != 15;
+ return 0 if $matrix->{c} + $matrix->{f} + $matrix->{i} != 15;
+
+ return 0 if $matrix->{a} + $matrix->{e} + $matrix->{i} != 15;
+ return 0 if $matrix->{c} + $matrix->{e} + $matrix->{g} != 15;
+
+ return 1;
+}
+
+
+# Check if two array refs have at least one equal element (1) or not (0)
+
+sub _match_arrays_ {
+ my $arr_1 = shift;
+ my $arr_2 = shift;
+
+ for my $i( $arr_1->@* ) {
+ for my $j( $arr_2->@* ) {
+ return 1 if $i == $j;
+ }
+ }
+ return 0;
+}
+
+sub _set_magic_matrix_values_ {
+ my $mag_mat = shift;
+ my $keys = shift;
+ my $values = shift;
+ for (my $i=0; $i<@$keys; $i++) {
+ $mag_mat->{$keys->[$i]} = $values->[$i];
+ }
+}
+
+=head2 magical_matrix
+
+Return an array with valid solutions of magical matrix 3x3
+
+=cut
+
+sub magical_matrix {
+
+ my @solutions = ();
+ my $mag_mat = {};
+
+
+
+ # 1. fill @valid with 3-tuples that sum 15
+ my $valid = [];
+ my @digits = (1..9);
+ for my $i (@digits) {
+ for my $j (grep { !/$i/ } @digits ) {
+ for my $k (grep { !/$i|$j/ } @digits ) {
+ push $valid->@*, [$i, $j, $k] if $i+$j+$k == 15;
+ }
+ }
+ }
+
+ # Try valid 3-tuples for row 1
+ for my $current_1 ($valid->@*) {
+ _set_magic_matrix_values_ ( $mag_mat, [qw/a b c/], $current_1 );
+
+ # Filter the tuples candidates for 2nd row
+ my @valid_2 = grep { ! _match_arrays_ ($_, $current_1) } $valid->@*;
+
+ # Try valid 3-tuples for row 2
+ for my $current_2 (@valid_2) {
+ _set_magic_matrix_values_ ( $mag_mat, [qw/d e f/], $current_2 );
+
+ # Filter the tuples candidates for 3nd row
+ my @valid_3 = grep { ! _match_arrays_ ($_, $current_2) } @valid_2;
+
+ # Try valid 3-tuples for row 3
+ for my $current_3 ( @valid_3 ) {
+ _set_magic_matrix_values_( $mag_mat, [qw/g h i/], $current_3 );
+
+ # Check the magic rules, and if ok, add the current setup to
+ # the final solutions
+ _check_magic_rules_ ($mag_mat)
+ && push @solutions, [$current_1, $current_2, $current_3];
+ }
+ }
+ }
+
+ return @solutions;
+}
+
+#----
+
+
+1970; \ No newline at end of file
diff --git a/challenge-089/miguel-prz/perl/ch-1.pl b/challenge-089/miguel-prz/perl/ch-1.pl
new file mode 100644
index 0000000000..b531cbc011
--- /dev/null
+++ b/challenge-089/miguel-prz/perl/ch-1.pl
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+use Test::More;
+
+#------------------------------------------------------------------------------
+
+require_ok './Task089_1.pm';
+
+my @tests = (
+ { DATA=> 3, EXPECTED=> 3 },
+ { DATA=> 4, EXPECTED=> 7 },
+);
+
+for my $t( @tests ) {
+
+ my $result = sum_gcd_unique_pairs ($t->{DATA});
+ ok $t->{EXPECTED} == $result, "sum_gcd_unique_pairs($t->{DATA}) == $result";
+}
+
+done_testing; \ No newline at end of file
diff --git a/challenge-089/miguel-prz/perl/ch-2.pl b/challenge-089/miguel-prz/perl/ch-2.pl
new file mode 100644
index 0000000000..49625d1a5b
--- /dev/null
+++ b/challenge-089/miguel-prz/perl/ch-2.pl
@@ -0,0 +1,13 @@
+use strict;
+use warnings;
+
+require './Task089_2.pm';
+
+my @solutions = Task089_2::magical_matrix();
+
+for my $matrix( @solutions ) {
+ for my $row( $matrix->@* ) {
+ print "[ @$row ]", "\n";
+ }
+ print "\n";
+} \ No newline at end of file