Matt Owen

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

return to portfolio
  1.  #!/usr/bin/perl
  2.  
  3.  use strict;
  4.  use warnings;
  5.  
  6.  
  7.  # factorial
  8.  sub factorial {
  9.   my $n = shift;
  10.   my $m = 1;
  11.   # $factorials = (0,1,1,1,2,2,3,6,4,24,5,120,6,720); can speed it up with a cache
  12.   $m *= $n-- while $n > 1;
  13.   return $m;
  14.  }
  15.  
  16.  
  17.  # sum
  18.  sub weird_digit_sum {
  19.   my $sum = 0;
  20.   $sum += factorial($_) for split //, shift;
  21.   return $sum;
  22.  }
  23.  
  24.  
  25.  my $sum = 0;
  26.  my %factorials;
  27.  
  28.  #$factorials = (0=>1, 1=>1, 2=>2);
  29.  #$factorials{$_} = $factorials{$_-1} * $_ for (3..9);
  30.  
  31.  for (10..7*factorial(9)) {
  32.   $sum += $_ if weird_digit_sum($_) == $_;
  33.  }
  34.  
  35.  
  36.  #
  37.  print $sum;