I used
Math::Combinatorics for both parts and a slight modification of the original test to get the answer (9867312) in less time than it takes to make a coffee...
use strict;
use warnings;
use Math::Combinatorics;
my @n = qw(1 2 3 4 6 7 8 9);
my $found;
foreach my $count (reverse (1..@n))
{
my $combinat = Math::Combinatorics->new(count => $count, data => [
+@n],);
my @comb;
while (@comb = $combinat->next_combination())
{
my @permu;
my $permute = Math::Combinatorics->new(data => [@comb]);
while (@permu = $permute->next_permutation())
{
if (passes(@permu))
{
print "@permu\n";
$found++;
}
}
}
exit if $found;
}
sub passes {
my $test_number = join '', @_;
for ( @_ ) {
return 0 unless $test_number % $_ == 0 ;
}
return 1;
}
update I have modified my original code taking the 5 out of the possible numbers and paring down the test as much as possible. This now runs much faster.