092 Square digit chains.pl 529 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 30 January 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=92
  7. # Runtime: 8.466s
  8. use 5.010;
  9. use strict;
  10. use List::Util qw(sum);
  11. use ntheory qw(todigits);
  12. my @cache;
  13. my @squares = map { $_ * $_ } 0 .. 9;
  14. sub chain {
  15. my ($n) = @_;
  16. $n == 1 && return 1;
  17. $n == 89 && return 89;
  18. $cache[$n] //= chain(sum(@squares[todigits($n)]));
  19. }
  20. my $count = 0;
  21. foreach my $n (1 .. 1e7) {
  22. ++$count if chain($n) == 89;
  23. }
  24. say $count;