aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2020-10-12 12:30:57 +0200
committerAlexander Pankoff <ccntrq@screenri.de>2020-10-12 12:30:57 +0200
commitfa79198d1c52baf12689a02d6594ab027c2f921d (patch)
treee24d286c4c1f65cc15bd2972f3ff18cd8fb061d1
parent1f3aee3539964c567010c11f189ddba4cbb873cc (diff)
downloadperlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.tar.gz
perlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.tar.bz2
perlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.zip
add perl solution for wk-081 ch-2
-rwxr-xr-xchallenge-082/alexander-pankoff/perl/ch-2.pl59
1 files changed, 59 insertions, 0 deletions
diff --git a/challenge-082/alexander-pankoff/perl/ch-2.pl b/challenge-082/alexander-pankoff/perl/ch-2.pl
new file mode 100755
index 0000000000..a5c586d085
--- /dev/null
+++ b/challenge-082/alexander-pankoff/perl/ch-2.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+
+use Pod::Usage;
+
+use List::Util qw(min all any);
+use Scalar::Util qw(looks_like_number);
+
+=pod
+
+=head1 SYNOPSIS
+
+Given three strings <A>, <B> and <C> this script will return whether <C> can be
+created by interleaving <A> and <B>
+
+=head1 USAGE
+
+ch-2.pl <A> <B> <C>
+
+=cut
+
+pod2usage(
+ -message => "$0: Need exactly three arguments",
+ -exitval => 1,
+ -verbose => 99,
+ -sections => "USAGE|SYNOPSIS",
+) if @ARGV != 3;
+
+my ( $A, $B, $C ) = @ARGV;
+say is_creatable_by_interleaving( $C, $A, $B );
+
+sub is_creatable_by_interleaving ( $target, $a, $b ) {
+ return 0 if length($target) != length($a) + length($b);
+ return 1 if !length($target);
+
+ my $head = substr( $target, 0, 1 );
+ my $rest = substr( $target, 1 );
+
+ return (
+ starts_with( $head, $a )
+ ? is_creatable_by_interleaving( $rest, substr( $a, 1 ), $b )
+ : 0
+ )
+ || (
+ starts_with( $head, $b )
+ ? is_creatable_by_interleaving( $rest, $a, substr( $b, 1 ) )
+ : 0
+ );
+}
+
+sub starts_with ( $char, $str ) {
+ return $str =~ m/^$char/;
+}