111 Primes with runs -- v2.pl 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 09 February 2017
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=111
  7. # Runtime: 0.065s
  8. use 5.010;
  9. use strict;
  10. use ntheory qw(is_prime);
  11. my $len = 10;
  12. my %table = (
  13. 0 => 8,
  14. 1 => 9,
  15. 2 => 8,
  16. 3 => 9,
  17. 4 => 9,
  18. 5 => 9,
  19. 6 => 9,
  20. 7 => 9,
  21. 8 => 8,
  22. 9 => 9,
  23. );
  24. sub comb_1 {
  25. my ($digit) = @_;
  26. my $r = $len - 1;
  27. my @p = ($digit) x $r;
  28. my $sum = 0;
  29. foreach my $i (0 .. $r) {
  30. foreach my $d (0 .. 9) {
  31. my @a = @p;
  32. splice(@a, $i, 0, $d);
  33. my $n = join('', @a);
  34. $sum += $n if $a[0] && is_prime($n);
  35. }
  36. }
  37. return $sum;
  38. }
  39. sub comb_2 {
  40. my ($digit) = @_;
  41. my $r = $len - 2;
  42. my @p = ($digit) x $r;
  43. my $sum = 0;
  44. foreach my $i (0 .. $r) {
  45. foreach my $d1 (0 .. 9) {
  46. foreach my $j (0 .. $r) {
  47. foreach my $d2 (0 .. 9) {
  48. my @a = @p;
  49. splice(@a, $i, 0, $d1);
  50. splice(@a, $j, 0, $d2);
  51. my $n = join('', @a);
  52. $sum += $n if $a[0] && is_prime($n);
  53. }
  54. }
  55. }
  56. }
  57. return $sum;
  58. }
  59. my $total = 0;
  60. foreach my $d (keys %table) {
  61. my $max = $table{$d};
  62. if ($max == 8) {
  63. $total += comb_2($d);
  64. }
  65. elsif ($max == 9) {
  66. $total += comb_1($d);
  67. }
  68. }
  69. say $total;