196 Prime triplets.pl 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 20 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=196
  7. # Runtime: 8.838s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(is_prime);
  12. sub vertical {
  13. ($_[0]**2 - $_[0] + 2) / 2;
  14. }
  15. sub prime_triples {
  16. my ($n) = @_;
  17. my $up = vertical($n - 1);
  18. my $down = vertical($n + 1);
  19. my $me = vertical($n);
  20. my $upup = vertical($n - 2);
  21. my $downdown = vertical($n + 2);
  22. my @valid = (
  23. [\$me, $me, $me + $n],
  24. [\$up, $up, $up + $n - 1],
  25. [\$down, $down, $down + $n + 1],
  26. [\$upup, $upup, $upup + $n - 2],
  27. [\$downdown, $downdown, $downdown + $n - 2],
  28. );
  29. my @moves = (
  30. [[1, -1], [3, -1]],
  31. [[2, -1], [4, -1]],
  32. [[1, +0], [3, +1]],
  33. [[2, +0], [4, +1]],
  34. [[1, +0], [2, +1]],
  35. [[2, +0], [1, +1]],
  36. [[1, +1], [3, +1]],
  37. [[2, +1], [4, +1]],
  38. [[2, +0], [4, -1]],
  39. [[1, +0], [3, -1]],
  40. [[1, +0], [2, -1]],
  41. [[1, -1], [0, -2]],
  42. [[2, -1], [0, -2]],
  43. [[1, +1], [0, +2]],
  44. [[2, +1], [0, +2]],
  45. [[2, +0], [1, -1]],
  46. [[2, -1], [2, +1]],
  47. [[1, -1], [1, +1]],
  48. [[1, +0], [3, +0]],
  49. [[2, +1], [4, +0]], # this happens only once
  50. );
  51. my $sum = 0;
  52. foreach my $i (1 .. $n) {
  53. if (is_prime($me)) {
  54. OUTER: foreach my $move (@moves) {
  55. foreach my $group (@$move) {
  56. my ($n, $n_min, $n_max) = @{$valid[$group->[0]]};
  57. my $v = $group->[1] + $$n;
  58. if ($v < $n_min or $v > $n_max or not is_prime($v)) {
  59. next OUTER;
  60. }
  61. }
  62. $sum += $me;
  63. last;
  64. }
  65. }
  66. ++$up;
  67. ++$down;
  68. ++$me;
  69. ++$upup;
  70. ++$downdown;
  71. }
  72. $sum;
  73. }
  74. my $x = prime_triples(5678027);
  75. my $y = prime_triples(7208785);
  76. say "$x + $y = ", $x + $y;