# RabbitFarm

## Part 1

You are given 2 positive numbers \$M and \$N. Write a script to list all common factors of the given numbers.

### Solution

``````
use strict;
use warnings;
##
# You are given 2 positive numbers \$M and \$N.
# Write a script to list all common factors of the given numbers.
##
sub factor{
my(\$n) = @_;
my @factors = (1);
foreach my \$j (2..sqrt(\$n)){
push @factors, \$j if \$n % \$j == 0;
push @factors, (\$n / \$j) if \$n % \$j == 0 && \$j ** 2 != \$n;
}
return @factors;
}

sub common_factors{
my(\$m, \$n) = @_;
my @common_factors = grep { my \$f = \$_; grep { \$f == \$_ } @{\$n}} @{\$m};
return @common_factors;
}

MAIN:{
my \$M = 12;
my \$N = 18;
my @m_factors = factor(\$M);
my @n_factors = factor(\$N);
print "(" . join(",", common_factors(\@m_factors, \@n_factors)) . ")\n";
}
``````

### Sample Run

``````
\$ perl perl/ch-1.pl
(1,2,6,3)
``````

I have used `sub factor` previously, back in Challenge 008. The most interesting thing in this solution is probably the nested `grep`’s. In order to nest them properly you need to create a local variable to hold the element being examined in the outer `grep` block. Here I use `\$f`. Although we need just two `grep`’s here this trick can be used to nest them more deeply.

## Part 2

You are given 3 strings; \$A, \$B and \$C. Write a script to check if \$C is created by an interleaving of \$A and \$B. Print 1 if check is success otherwise 0.

``````
use strict;
use warnings;
##
# You are given 3 strings; \$A, \$B and \$C.
# Write a script to check if \$C is created by interleave \$A and \$B.
# Print 1 if check is success otherwise 0.
##
sub find_remove{
my(\$s, \$x) = @_;
my \$i = index(\$s, \$x);
if(\$i != -1){
substr \$s, \$i, length(\$x), "";
return \$s;
}
return undef;
}
MAIN:{
my \$A = "XY";
my \$B = "X";
my \$C = "XXY";
my \$s = find_remove(\$C, \$A);
if(\$s && \$s eq \$B){
print "1\n";
exit;
}
else{
\$s = find_remove(\$C, \$B);
if(\$s && \$s eq \$A){
print "1\n";
exit;
}
}
print "0\n";
}
``````

### Sample Run

``````
\$ perl perl/ch-2.pl
1
``````

### Notes

I believe this is the most straightforward way of tackling this problem. By checking for both `\$A` and `\$B` as substrings and removing them if found we can determine if there was an interleaving by checking to see if the other remains.