aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-082/polettix/blog.txt1
-rw-r--r--challenge-082/polettix/blog1.txt1
-rw-r--r--challenge-082/polettix/perl/ch-1.pl17
-rw-r--r--challenge-082/polettix/perl/ch-2.pl26
4 files changed, 45 insertions, 0 deletions
diff --git a/challenge-082/polettix/blog.txt b/challenge-082/polettix/blog.txt
new file mode 100644
index 0000000000..ea17acd2ae
--- /dev/null
+++ b/challenge-082/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/10/13/pwc082-common-factors/
diff --git a/challenge-082/polettix/blog1.txt b/challenge-082/polettix/blog1.txt
new file mode 100644
index 0000000000..63c2b2bc4b
--- /dev/null
+++ b/challenge-082/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2020/10/14/pwc082-interleave-string/
diff --git a/challenge-082/polettix/perl/ch-1.pl b/challenge-082/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..f2e7056ef5
--- /dev/null
+++ b/challenge-082/polettix/perl/ch-1.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub gcd ($A, $B) { ($A, $B) = ($B % $A, $A) while $A; return $B }
+
+sub common_factors ($A, $B) {
+ my $gcd = gcd($A, $B);
+ grep { !($gcd % $_) } 1 .. int($gcd / 2), $gcd;
+}
+
+my $M = shift || 12;
+my $N = shift || 18;
+say '(', join(', ', common_factors($M, $N)), ')';
diff --git a/challenge-082/polettix/perl/ch-2.pl b/challenge-082/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..62e1b7ad38
--- /dev/null
+++ b/challenge-082/polettix/perl/ch-2.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub is_interleaving ($A, $B, $C) {
+ my ($lA, $lB, $lC) = map { length $_ } ($A, $B, $C);
+ ($lA, $lB, $A, $B) = ($lB, $lA, $B, $A) if $lA > $lB;
+ return 0 if ($lA + $lB != $lC) || ($lB > $lA + 1);
+ my ($fA, $fB) = ($lA == $lB, 1); # can go first?
+ for my $i (0 .. $lB - 1) {
+ my ($cA, $cB) = map { substr $_, $i, 1 } ($A, $B);
+ my $sC = substr $C, 2 * $i, 2;
+ $fA &&= ($sC eq ($cA . $cB));
+ $fB &&= ($sC eq ($cB . $cA));
+ return 0 unless $fA || $fB;
+ }
+ return 1;
+}
+
+my $A = shift || 'XXY';
+my $B = shift || 'XXZ';
+my $C = shift || 'XXXXZY';
+say is_interleaving($A, $B, $C);