Matt Owen

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

return to portfolio
  1.  #!/usr/bin/perl
  2.  
  3.  use strict;
  4.  use warnings;
  5.  use combinatorics;
  6.  use euler;
  7.  
  8.  
  9.  # only 1's
  10.  sub only1s {
  11.   my $hash = shift;
  12.   for (keys %$hash) {
  13.   return 0 if $hash->{$_} > 1;
  14.   }
  15.   return 1;
  16.  }
  17.  
  18.  
  19.  # init
  20.  my ($count) = 0;
  21.  my $digits = {};
  22.  
  23.  $digits->{$_} = 0 for 0..9;
  24.  
  25.  
  26.  # work
  27.  
  28.  for my $d8d9d10 (map { $_ * 17 } 1..58) {
  29.   # add leading zeroes
  30.   $d8d9d10 = ('0' x (3-length $d8d9d10)) . $d8d9d10;
  31.  
  32.   # build the hash
  33.   $digits->{$_}++ for split //, $d8d9d10;
  34.  
  35.   # reset hash and go to next element in list
  36.   goto OUT unless only1s $digits;
  37.  
  38.  
  39.   # only use unused digits
  40.   for my $d7 (sort grep { $digits->{$_} < 1 } keys %$digits) {
  41.   $digits->{$d7}++;
  42.  
  43.   # d6 must be 0 or 5
  44.   for my $d6 (grep { $digits->{$_} < 1 } (0,5)) {
  45.   $digits->{$d6}++;
  46.  
  47.  
  48.   # d4 must be 0, 2, 4, 6, 8
  49.   for my $d4 (grep { $digits->{$_} < 1 } (0, 2, 4, 6, 8)) {
  50.   $digits->{$d4}++;
  51.  
  52.  
  53.  
  54.   for my $d3 (grep { $digits->{$_} < 1 } 0..9) {
  55.   $digits->{$d3}++;
  56.  
  57.   for my $d5 (grep { $digits->{$_} < 1 } 0..9) {
  58.   $digits->{$d5}++;
  59.  
  60.   for my $d2 (grep { $digits->{$_} < 1 } 0..9) {
  61.   $digits->{$d2}++;
  62.  
  63.   if ("$d3$d4$d5" % 3 == 0 && "$d5$d6$d7" % 7 == 0 && ("$d6$d7" . substr $d8d9d10, 0, 1) % 11 == 0 && index("$d2$d3$d4$d5$d6$d7$d8d9d10",0) != -1) {
  64.  
  65.   my $s = ($d7 . substr($d8d9d10, 0, 2));
  66.  
  67.   print "$d2$d3$d4$d5$d6$d7$d8d9d10\n" if $s % 13 == 0;
  68.   }
  69.  
  70.  
  71.   $digits->{$d2}--;
  72.   }
  73.  
  74.   $digits->{$d5}--;
  75.   }
  76.  
  77.  
  78.   $digits->{$d3}--;
  79.   }
  80.  
  81.  
  82.   $digits->{$d4}--;
  83.   }
  84.  
  85.  
  86.   $digits->{$d6}--;
  87.   }
  88.  
  89.   $digits->{$d7}--;
  90.   }
  91.  
  92.  
  93.  OUT: $digits->{$_} = 0 for 0..9;
  94.  }
  95.  
  96.  
  97.  #$digits->{$_}++ for split //, 6969;
  98.  #print only1s($digits) ? 1 : 0;
  99.  print $count;