use strict; use List::MoreUtils qw(uniq); our @a = qw(0 1 2 3 4 5 6 7 8 9); our @cond = qw(2 3 5 7 11 13 17); our %nums; our @data; ptn(\@data, '', 0, @a); foreach my $n (@data) { foreach my $c (@cond) { if (!defined($nums{$c})) { $nums{$c} = []; } if ($n % $c == 0) { push(@{$nums{$c}}, $n); } } } our $sum = 0; for (my $i = 0; $i <= 9; ++$i) { ptn2($i, 0); } print "SUM($sum)\n"; sub ptn2 { my ($k, $c) = @_; if ($c == 7) { if (length($k) == scalar(uniq(split(//, $k)))) { $sum += $k; print $k,"\n"; } return; } my @a = @{$nums{$cond[$c]}}; my $front = $k % 100; foreach my $n (@a) { if ($c == 0) { ptn2($k.$n, $c + 1); } elsif ($front == int($n / 10)) { ptn2($k.($n % 10), $c + 1); } } } sub ptn { my ($d, $k, $c, @a) = @_; if ($c == 3) { push(@$d, int($k)); # print $k,"\n"; return; } for (my $i = 0; $i < scalar(@a); ++$i) { my $p = shift(@a); ptn($d, $k.$p, $c + 1, @a); push(@a, $p); } }