# Perl Christmas Quiz

Fri Dec 12 12:43:38 GMT 2008

```> Date: Fri, 12 Dec 2008 12:10:19 +0000
> From: paulm at paulm.com
> To: london.pm at london.pm.org
> Subject: Re: Perl Christmas Quiz
>
> SPOILERS contd

>
> This isn't a set question though. Sets have unique membership,
>
> stix:~\$ perl -MSet::Scalar -le '\$s = Set::Scalar->new(1,1); print \$s->elements'
> 1
>
> Something like,
>
> sub intersect {
>   my @s1 = sort @{\$_[0]};
>   my @s2 = sort @{\$_[1]};
>   my @s3;
>   while (my \$e = \$s1[0]) {
>     if (\$e == \$s2[0]) {
>       push @s3, \$e;
>       shift @s2;
>       shift @s1;
>     } elsif (\$e > \$s2[0]) {
>       shift @s2;
>     } else {
>       shift @s1;
>     }
>   }
>   @s3;
> }
>
> There's probably some clever answer using List::MoreUtils.
>
> P

In my baby perl.

sub intersect

{

my (\$a, \$b) = @_;

my (\$c, \$d) = ({}, []);

foreach (@\$a) { \$c->{\$_}->[0]++}

foreach (@\$b) { \$c->{\$_}->[1]++}

while( my (\$k, \$v) = each %\$c ) {

my (\$i, \$j) = @\$v;

for(my \$x=0; \$x < (\$i < \$j ? \$i : \$j); \$x++) {push @\$d, \$k}

}
return \$d;

}