Square digit chains
Author: Moritz Lenz
https://projecteuler.net/problem=92
A number chain is created by continuously adding the square of the digits in a number to form a new number until it has been seen before.
For example,
44 → 32 → 13 → 10 → Pod::FormattingCode<94304298579360> → Pod::FormattingCode<94304298579296> 85 → Pod::FormattingCode<94304298579232> → 145 → 42 → 20 → 4 → 16 → 37 → 58 → Pod::FormattingCode<94304298579168>
Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. What is most amazing is that EVERY starting number will eventually arrive at 1 or 89.
How many starting numbers below ten million will arrive at 89?
Source code: prob092-moritz.pl
use v6; unless @*ARGS { say 'WARNING'; say 'This is going to take *really* long (order of magnitude: 30 h) with'; say 'the default number (1e7)'; say 'To run it for a small number, simply supply that number'; say 'on the command line.'; } my %ser; %ser{1} = 1; %ser{89} = 89; my @squares = map { $_ * $_ }, 0..9; sub ser($i is copy) { return %ser{$i} if %ser{$i}:exists; my @to_update; while !(%ser{$i}:exists) { @to_update.push($i); $i = [+] $i.split('').map: { $_ * $_ }; } my $s = %ser{$i}; %ser{$_} = $s for @to_update; return $s; } my $c = 0; my $target = @*ARGS[0] // 1e7; say "running up to $target"; for 1..($target-1) { .say if $_ % ($target / 10).Int == 0; ++$c if ser($_) == 89; } say "Result: $c";