diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2020-10-12 12:30:57 +0200 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2020-10-12 12:30:57 +0200 |
| commit | fa79198d1c52baf12689a02d6594ab027c2f921d (patch) | |
| tree | e24d286c4c1f65cc15bd2972f3ff18cd8fb061d1 | |
| parent | 1f3aee3539964c567010c11f189ddba4cbb873cc (diff) | |
| download | perlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.tar.gz perlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.tar.bz2 perlweeklychallenge-club-fa79198d1c52baf12689a02d6594ab027c2f921d.zip | |
add perl solution for wk-081 ch-2
| -rwxr-xr-x | challenge-082/alexander-pankoff/perl/ch-2.pl | 59 |
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/; +} |
