aboutsummaryrefslogtreecommitdiff
path: root/challenge-099
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2021-02-09 00:05:18 +0100
committerFlavio Poletti <flavio@polettix.it>2021-02-09 00:05:18 +0100
commitbb5fd690cb9731063fd2d59ba79e328166852eb4 (patch)
tree315720f4edbd0f056e2017dae1553605fa567a4f /challenge-099
parent323110b0d053e2067a3cae6db62bc209f869bc57 (diff)
downloadperlweeklychallenge-club-bb5fd690cb9731063fd2d59ba79e328166852eb4.tar.gz
perlweeklychallenge-club-bb5fd690cb9731063fd2d59ba79e328166852eb4.tar.bz2
perlweeklychallenge-club-bb5fd690cb9731063fd2d59ba79e328166852eb4.zip
Add polettix's solutions to PWC099
Diffstat (limited to 'challenge-099')
-rw-r--r--challenge-099/polettix/blog.txt1
-rw-r--r--challenge-099/polettix/blog1.txt1
-rw-r--r--challenge-099/polettix/perl/ch-1.pl16
-rw-r--r--challenge-099/polettix/perl/ch-2.pl31
4 files changed, 49 insertions, 0 deletions
diff --git a/challenge-099/polettix/blog.txt b/challenge-099/polettix/blog.txt
new file mode 100644
index 0000000000..a44ed25ad8
--- /dev/null
+++ b/challenge-099/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/02/10/pwc099-pattern-match/
diff --git a/challenge-099/polettix/blog1.txt b/challenge-099/polettix/blog1.txt
new file mode 100644
index 0000000000..28712cb9a1
--- /dev/null
+++ b/challenge-099/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/02/11/pwc099-unique-subsequence/
diff --git a/challenge-099/polettix/perl/ch-1.pl b/challenge-099/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..8a298e5b33
--- /dev/null
+++ b/challenge-099/polettix/perl/ch-1.pl
@@ -0,0 +1,16 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub pattern_match ($S, $T) {
+ $T = join '',
+ map { $_ eq '*' ? '.*' : $_ eq '?' ? '.' : quotemeta($_) }
+ split m{([*?])}mxs, $T;
+ return $S =~ m{\A$T\z}mxs ? 1 : 0;
+}
+
+my $string = shift // 'abcde';
+my $pattern = shift // 'a*e';
+say pattern_match($string, $pattern);
diff --git a/challenge-099/polettix/perl/ch-2.pl b/challenge-099/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..97e816815d
--- /dev/null
+++ b/challenge-099/polettix/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub unique_subsequence ($S, $T) {
+ my $lenT = length $T or return 1;
+ my $lenS = length $S or return 0;
+ my $first = substr $T, 0, 1, '';
+ --$lenT;
+ my $s = 0; # sum
+ my $p = 0; # search start position
+ while (($p < $lenS) && (my $i = index $S, $first, $p) >= $p) {
+ $s += unique_subsequence(substr($S, $i), $T) if $lenS - $i >= $lenT;
+ $p = $i + 1;
+ }
+ return $s;
+}
+
+sub unique_subsequence_rx ($S, $T) {
+ $T = join '.*', split m{}mxs, $T;
+ my $count = 0;
+ 1 while $S =~ m{$T(?{++$count})(?!)};
+ return $count;
+}
+
+my $string = shift // 'littleit';
+my $subsequence = shift // 'lit';
+say unique_subsequence($string, $subsequence);
+say unique_subsequence_rx($string, $subsequence);