571 Super Pandigital Numbers.pl 884 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 20 August 2017
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=571
  6. # Brute-force solution.
  7. # Runtime: ~12 minutes.
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use List::Util qw(uniq all min);
  12. use ntheory qw(todigits fromdigits);
  13. use Algorithm::Combinatorics qw(variations);
  14. my $base = shift(@ARGV) // 12; # pandigital in all bases 2..$base
  15. my $first = 10; # generate first n numbers
  16. my @digits = (1, 0, 2 .. $base - 1);
  17. my @bases = reverse(2 .. $base - 1);
  18. my $sum = 0;
  19. my $iter = variations(\@digits, $base);
  20. while (defined(my $t = $iter->next)) {
  21. if ($t->[0]) {
  22. my $d = fromdigits($t, $base);
  23. if (all { uniq(todigits($d, $_)) == $_ } @bases) {
  24. say "Found: $d";
  25. $sum += $d;
  26. last if --$first == 0;
  27. }
  28. }
  29. }
  30. say "Sum: $sum";