092 Square digit chains -- v2.pl 565 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/perl
  2. # Author: Trizen
  3. # Date: 21 March 2023
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=92
  6. # Runtime: 11.245s
  7. use 5.010;
  8. use strict;
  9. use ntheory qw(todigits);
  10. use List::Util qw(sum);
  11. my @squares = map { $_ * $_ } 0 .. 9;
  12. my @cache; $cache[1] = 1; $cache[89] = 89;
  13. my $count = 0;
  14. foreach my $k (1 .. 1e7) {
  15. my $n = $k;
  16. while (1) {
  17. $n = ($cache[$n] //= sum(@squares[todigits($n)]));
  18. if ($n == 1 or $n == 89) {
  19. last;
  20. }
  21. }
  22. if ($n == 89) {
  23. ++$count;
  24. }
  25. }
  26. say $count;