Matt Owen

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

return to portfolio
  1.  #!/usr/bin/perl
  2.  
  3.  use strict;
  4.  use warnings;
  5.  use combinatorics;
  6.  use euler;
  7.  
  8.  
  9.  # used to build lists
  10.  sub distinct_elements {
  11.   my %hash;
  12.   return (int @_ == int grep { not $hash{$_}++ } @_) ? 1 : 0;
  13.  }
  14.  
  15.  
  16.  # init
  17.  my (@d5d6d7, @d6d7d8, @d7d8d9, @d8d9d10);
  18.  
  19.  
  20.  # get all valid d8,d9,d10
  21.  for (1..999/17) {
  22.   $_ = 17*$_;
  23.   $_ = '0' x (3-length($_)) . $_;
  24.   push @d8d9d10, $_ if distinct_elements split //, $_;
  25.  }
  26.  
  27.  
  28.  my (@d3d4d5, @d4d5d6);
  29.  
  30.  
  31.  # get all valid d3, d4, d5, d6
  32.  for my $d3 (0..9) {
  33.   for my $d4 (0, 2, 4, 6, 8) {
  34.   for my $d6 (0, 5) {
  35.   for my $d5(0..9) {
  36.   push @d3d4d5, "$d3$d4$d5" if "$d3$d4$d5" % 3 == 0 && distinct_elements(split //, "$d3$d4$d5");
  37.   push @d4d5d6, "$d4$d5$d6" if distinct_elements(split //, "$d4$d5$d6");
  38.   }
  39.   }
  40.   }
  41.  }
  42.  
  43.  
  44.  my (@d3d4d5d6);
  45.  
  46.  
  47.  # get valid results for d3, d4, d5, d6
  48.  for my $left (@d3d4d5) {
  49.   for my $right (@d4d5d6) {
  50.   push @d3d4d5d6, "$left" . substr($right, 2) if (substr($left, 1, 2) eq substr($right, 0, 2));
  51.   }
  52.  }
  53.  
  54.  
  55.  # filter non-pandigital candidates
  56.  @d3d4d5d6 = grep { distinct_elements split(//, $_)} @d3d4d5d6;
  57.  
  58.  
  59.  # new variable
  60.  my (@d3d4d5d6d7);
  61.  
  62.  
  63.  # get valid results for d7
  64.  for my $left (@d3d4d5d6) {
  65.   my $leftish = substr($left, -2);
  66.   for my $right (0..9) {
  67.   push @d3d4d5d6d7, "$left$right" if "$leftish$right" % 7 == 0 && distinct_elements split(//, "$left$right");
  68.   }
  69.  }
  70.  
  71.  
  72.  # filter non-pandigital candidates
  73.  @d3d4d5d6d7 = grep { distinct_elements split(//, $_)} @d3d4d5d6d7;
  74.  
  75.  
  76.  
  77.  
  78.  my @d3_10;
  79.  for my $left (@d3d4d5d6d7) {
  80.   for my $right (@d8d9d10) {
  81.   next unless (substr($left, -2) . substr($right,0,1)) % 11 == 0;
  82.   next unless (substr($left, -1) . substr($right,0,2)) % 13 == 0;
  83.   next unless distinct_elements split(//,"$left$right");
  84.   push @d3_10, "$left$right";
  85.   }
  86.  }
  87.  
  88.  
  89.  @d3_10 = grep { distinct_elements split(//, $_) } @d3_10;
  90.  
  91.  my @all;
  92.  
  93.  for my $d1 (1..9) {
  94.   for my $d2 (0..9) {
  95.   for (@d3_10) {
  96.   push @all, "$d1$d2$_";
  97.   }
  98.   }
  99.  }
  100.  
  101.  @all = grep { distinct_elements split(//, $_) } @all;
  102.  
  103.  my %h = ();
  104.  my $sum = 0;
  105.  for my $k (grep {not $h{$_}++} @all) {
  106.   $sum += $k;
  107.  }
  108.  
  109.  print $sum;