050 Consecutive prime sum.pl 895 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Website: https://github.com/trizen
  5. # Which prime, below one-million, can be written as the sum of the most consecutive primes?
  6. # https://projecteuler.net/problem=50
  7. # Runtime: 0.064s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use List::UtilsBy qw(max_by);
  12. use ntheory qw(is_prime nth_prime);
  13. my $limit = 1e6;
  14. my $sum = 0;
  15. my @primes;
  16. for (my $i = 1 ; ; ++$i) {
  17. my $p = nth_prime($i);
  18. $sum += $p;
  19. if ($sum / 2 > $limit) {
  20. last;
  21. }
  22. push @primes, $p;
  23. }
  24. my @arr;
  25. my $l = scalar(@primes) - 1;
  26. for (my $i = 0 ; $i <= $l ; ++$i) {
  27. my $sum = $primes[$i];
  28. for (my $j = $i + 1 ; ($j <= $l - $i) && (($sum += $primes[$j]) < $limit) ; ++$j) {
  29. is_prime($sum) && push @arr, [$j - $i + 1, $sum];
  30. }
  31. }
  32. my $p = max_by { $_->[0] } @arr;
  33. say "$p->[1] is the sum of $p->[0] consecutive primes.";