How to resolve the algorithm Iterated digits squaring step by step in the Raku programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Iterated digits squaring step by step in the Raku programming language
Table of Contents
Problem Statement
If you add the square of the digits of a Natural number (an integer bigger than zero), you always end with either 1 or 89: An example in Python:
Or, for much less credit - (showing that your algorithm and/or language is slow): This problem derives from the Project Euler problem 92. For a quick algorithm for this task see the talk page
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Iterated digits squaring step by step in the Raku programming language
Source code in the raku programming language
constant @sq = ^10 X** 2;
my $cnt = 0;
sub Euler92($n) {
$n == any(1,89) ?? $n !!
(state %){$n} //= Euler92( [+] @sq[$n.comb] )
}
for 1 .. 1_000_000 -> $n {
my $i = +$n.comb.sort.join;
++$cnt if Euler92($i) == 89;
}
say $cnt;
my @cache;
@cache[1] = 1;
@cache[89] = 89;
sub Euler92(int $n) {
$n < 649 # 99,999,999 sums to 648, so no point remembering more
?? (@cache.AT-POS($n) //= ids($n))
!! ids($n)
}
sub ids(int $num --> int) {
my int $n = $num;
my int $ten = 10;
my int $sum = 0;
my int $t;
my int $c;
repeat until $n == 89 or $n == 1 {
$sum = 0;
repeat {
$t = $n div $ten;
$c = $n - $t * $ten;
$sum = $sum + $c * $c;
} while $n = $t;
$n = @cache.AT-POS($sum) // $sum;
}
$n;
}
my int $cnt = 0;
for 1 .. 100_000_000 -> int $n {
$cnt = $cnt + 1 if Euler92($n) == 89;
}
say $cnt;
sub endsWithOne($n --> Bool) {
my $digit;
my $sum = 0;
my $nn = $n;
loop {
while $nn > 0 {
$digit = $nn % 10;
$sum += $digit²;
$nn = $nn div 10;
}
return True if $sum == 1;
return False if $sum == 89;
$nn = $sum;
$sum = 0;
}
}
my $k = 8; # 10**8
my @sums is default(0) = 1,0;
my $s;
for 1 .. $k -> $n {
for $n*81 … 1 -> $i {
for 1 .. 9 -> $j {
$s = $j²;
last if $s > $i;
@sums[$i] += @sums[$i - $s];
}
}
}
my $ends-with-one = sum flat @sums[(1 .. $k*81).grep: { endsWithOne($_) }], +endsWithOne(10**$k);
say 10**$k - $ends-with-one;
You may also check:How to resolve the algorithm File size step by step in the Clojure programming language
You may also check:How to resolve the algorithm OpenGL step by step in the Pike programming language
You may also check:How to resolve the algorithm Luhn test of credit card numbers step by step in the Transact-SQL programming language
You may also check:How to resolve the algorithm Kaprekar numbers step by step in the Go programming language
You may also check:How to resolve the algorithm Twelve statements step by step in the XPL0 programming language