diff options
| -rw-r--r-- | challenge-099/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-099/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-099/polettix/perl/ch-1.pl | 16 | ||||
| -rw-r--r-- | challenge-099/polettix/perl/ch-2.pl | 31 |
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); |
