014 Longest Collatz sequence.pl 780 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # https://github.com/trizen
  4. # The following iterative sequence is defined for the set of positive integers:
  5. # n → n/2 (n is even)
  6. # n → 3n + 1 (n is odd)
  7. # Which starting number, under one million, produces the longest chain?
  8. # https://projecteuler.net/problem=14
  9. # Runtime: 2.222s
  10. use 5.010;
  11. use strict;
  12. my %cache;
  13. sub collatz {
  14. my ($n) = @_;
  15. return 1 if ($n == 1);
  16. $cache{$n} //= (
  17. ($n % 2 == 0)
  18. ? 1 + collatz($n >> 1)
  19. : 1 + collatz((3 * $n + 1) >> 1)
  20. );
  21. }
  22. my $num = 0;
  23. my $max = 0;
  24. foreach my $i (1 .. 1e6 - 1) {
  25. my $value = collatz($i);
  26. if ($value > $max) {
  27. $max = $value;
  28. $num = $i;
  29. }
  30. }
  31. say $num;