aboutsummaryrefslogtreecommitdiff
path: root/challenge-089
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-12-06 17:51:15 +0000
committerGitHub <noreply@github.com>2020-12-06 17:51:15 +0000
commit735a09207fded6a28bc2dcf25c5ffadb9115db9a (patch)
tree25f37fd52ee7ce638eb546dc76cfcfe3dc9257e5 /challenge-089
parentb9b2bb60547fc090a25f1356048f0f5631a29e23 (diff)
parent8e5a61d8b0f1e39eeb02bc07f8c7ca0d2b67d117 (diff)
downloadperlweeklychallenge-club-735a09207fded6a28bc2dcf25c5ffadb9115db9a.tar.gz
perlweeklychallenge-club-735a09207fded6a28bc2dcf25c5ffadb9115db9a.tar.bz2
perlweeklychallenge-club-735a09207fded6a28bc2dcf25c5ffadb9115db9a.zip
Merge pull request #2925 from juliodcs/juliodcs-week89
juliodcs-week89
Diffstat (limited to 'challenge-089')
-rw-r--r--challenge-089/juliodcs/perl/ch-1.pl36
-rw-r--r--challenge-089/juliodcs/perl/ch-2.pl50
-rw-r--r--challenge-089/juliodcs/raku/ch-1.raku19
-rw-r--r--challenge-089/juliodcs/raku/ch-2.raku18
4 files changed, 123 insertions, 0 deletions
diff --git a/challenge-089/juliodcs/perl/ch-1.pl b/challenge-089/juliodcs/perl/ch-1.pl
new file mode 100644
index 0000000000..aee1c5877a
--- /dev/null
+++ b/challenge-089/juliodcs/perl/ch-1.pl
@@ -0,0 +1,36 @@
+use strict;
+use warnings;
+use experimental 'signatures';
+use feature 'say';
+
+sub _gcd($a, $b) {
+ return $b ? _gcd($b, $a % $b) : $a
+}
+
+sub _gcd_sum($list, $i, $j, $acc) {
+ return $acc if $i == $list->@*;
+
+ @_ = $j == $list->@*
+ ? ($list, $i + 1, $i + 2, $acc)
+ : ($list, $i, $j + 1, $acc + _gcd($list->[$i], $list->[$j]));
+
+ goto &_gcd_sum;
+}
+
+sub gcd_sum($n) {
+ _gcd_sum [ 1 .. $n ], 0, 1, 0
+}
+
+######## MAIN and TESTS ########
+
+if (@ARGV == 1) {
+ say gcd_sum(shift);
+ exit 0
+}
+
+use Test::More;
+
+is gcd_sum(3), 3, 'gcd-sum of 3';
+is gcd_sum(4), 7, 'gcd-sum of 4';
+
+done_testing;
diff --git a/challenge-089/juliodcs/perl/ch-2.pl b/challenge-089/juliodcs/perl/ch-2.pl
new file mode 100644
index 0000000000..e541b6dc7b
--- /dev/null
+++ b/challenge-089/juliodcs/perl/ch-2.pl
@@ -0,0 +1,50 @@
+use strict;
+use warnings;
+use feature 'say';
+use experimental 'signatures';
+
+sub set_positions($matrix, $side) {
+ my $y = int($side / 2);
+ my $x = $side - 1;
+ for my $number (1 .. $side ** 2) {
+ if ($y == 0 && $x == $side - 1) {
+ $x--;
+ }
+ elsif ($number > 1) {
+ $y = ($y - 1) % $side;
+ $x = ($x + 1) % $side;
+ }
+
+ if ($matrix->[$y][$x] != 0) {
+ $y = ($y + 1) % $side;
+ $x = ($x - 2) % $side;
+ }
+
+ $matrix->[$y][$x] = $number;
+ }
+}
+
+sub print_magic($side) {
+ die 'Not an odd matrix' unless $side % 2;
+ my @matrix;
+ push @matrix, [(0) x $side] for 1 .. $side;
+ set_positions(\@matrix, $side);
+ display_matrix(\@matrix, $side);
+}
+
+sub display_matrix($matrix, $side) {
+ my $sum = $side * (1 + $side ** 2) / 2;
+ my $max_number = length($side * $side);
+
+ say "The sum for a $side-side matrix is: $sum";
+
+ for my $row ($matrix->@*) {
+ say join ' ', map { sprintf "%${max_number}s", $_ } $row->@*;
+ }
+}
+
+say print_magic(3);
+say print_magic(5);
+say print_magic(7);
+say print_magic(9);
+say print_magic(11);
diff --git a/challenge-089/juliodcs/raku/ch-1.raku b/challenge-089/juliodcs/raku/ch-1.raku
new file mode 100644
index 0000000000..5d07b5918f
--- /dev/null
+++ b/challenge-089/juliodcs/raku/ch-1.raku
@@ -0,0 +1,19 @@
+#! /usr/bin/raku
+
+sub gcd-sum($n) {
+ (1 .. $n).combinations(2).map({[gcd] @^it}).sum
+}
+
+######## MAIN and TESTS ########
+
+if @*ARGS == 1 {
+ say gcd-sum @*ARGS.head.Int;
+ exit 0
+}
+
+use Test;
+
+is gcd-sum(3), 3, 'gcd-sum of 3';
+is gcd-sum(4), 7, 'gcd-sum of 4';
+
+done-testing;
diff --git a/challenge-089/juliodcs/raku/ch-2.raku b/challenge-089/juliodcs/raku/ch-2.raku
new file mode 100644
index 0000000000..e537ec62d2
--- /dev/null
+++ b/challenge-089/juliodcs/raku/ch-2.raku
@@ -0,0 +1,18 @@
+#! /usr/bin/raku
+
+constant LINES = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6));
+constant CENTER = 4;
+
+# Brute force, but we optimize it a little by requiring center element == 5
+# This is mathematically true for a 3x3 matrix. See: https://math.stackexchange.com/a/1789360/842542
+sub magic-matrix {
+ for (1 .. 9).permutations.grep({ $_[CENTER] == 5 }) -> @list {
+ print-as-matrix @list if 15 == all LINES.map: *.map({ @list[$^i] }).sum
+ }
+}
+
+sub print-as-matrix(@list) {
+ say "{@list.rotor(3).map(*.join: ' ').join: "\n"}\n";
+}
+
+magic-matrix;