Matt Owen

source code for "files/pe/pe_032.pl"

return to portfolio
  1.  #!/usr/bin/perl
  2.  
  3.  
  4.  use strict;
  5.  use warnings;
  6.  
  7.  
  8.  # factorial
  9.  sub factorial {
  10.   my $m = 1;
  11.   $_ = shift;
  12.   $m *= $_-- while $_;
  13.   return $m;
  14.  }
  15.  
  16.  # permute
  17.  sub permute {
  18.   my ($k, @s) = @_;
  19.  
  20.   return @s if $k < 1;
  21.   return 0 if $k > factorial int @s;
  22.  
  23.   for my $j (2..int @s) {
  24.   ($s[$k%$j], $s[$j-1]) = ($s[$j-1], $s[$k%$j]);
  25.   $k = int $k / $j;
  26.   }
  27.  
  28.   return @s;
  29.  }
  30.  
  31.  
  32.  #
  33.  sub is_pandigital {
  34.   my $s = join '', sort @_;
  35.   $s = join '', sort split //, $s;
  36.   return $s eq "123456789" ? 1: 0;
  37.  }
  38.  
  39.  
  40.  my $sum=0;
  41.  my %h;
  42.  
  43.  for my $j (10..10000) {
  44.   for my $k (1..10000/$j+1) {
  45.   $h{$j*$k} = "$j $k" if is_pandigital $j, $k, $j*$k;
  46.   }
  47.  }
  48.  
  49.  
  50.  #
  51.  $sum += $_ for keys %h;
  52.  
  53.  print "$_ => $h{$_}\n" for sort keys %h;
  54.  
  55.  print "\n\n$sum\n";