118 Pandigital prime sets.pl 906 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 05 May 2017
  4. # License: GPLv3
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=118
  7. # Runtime: 17.289s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(is_prime);
  12. use Algorithm::Combinatorics qw(variations);
  13. my @primes;
  14. foreach my $i (1 .. 8) {
  15. my $iter = variations([1 .. 9], $i);
  16. while (defined(my $arr = $iter->next)) {
  17. my $n = join('', @$arr);
  18. if (is_prime($n)) {
  19. push @primes, $n;
  20. }
  21. }
  22. }
  23. my $count = 0;
  24. my $limit = $#primes;
  25. sub p_118 {
  26. my ($pos, $root) = @_;
  27. if (length($root) == 9) {
  28. return ++$count;
  29. }
  30. if ($root !~ /[$primes[$pos]]/) {
  31. p_118($pos, $root . $primes[$pos]);
  32. }
  33. if ($pos < $limit
  34. and length($root)
  35. + length($primes[$pos + 1]) <= 9
  36. ) {
  37. p_118($pos + 1, $root);
  38. }
  39. }
  40. p_118(0, '');
  41. say $count;