RosettaCodeData/Task/Iterated-digits-squaring/Mathematica/iterated-digits-squaring.math

38 lines
1.1 KiB
Plaintext

sumDigitsSquared[n_Integer] := Total[IntegerDigits[n]^2]
stopValues = Join[{1}, NestList[sumDigitsSquared, 89, 7]];
iterate[n_Integer] :=
NestWhile[sumDigitsSquared, n, Intersection[stopValues, {#}] == {} &]
numberOfDigits = 8;
maxSum = numberOfDigits 9^2;
loopVariables =
ToExpression@Table["i" <> ToString[n], {n, numberOfDigits}];
iteratesToOne = Cases[Range@maxSum, _?(iterate[#] == 1 &)];
allIterators =
Flatten[{Reverse@#, 9}] & /@ Partition[loopVariables, 2, 1];
maxCombinations = numberOfDigits!;
ssd =
SparseArray[Table[n^2 -> numberOfDigits, {n, 9}], {maxSum}];
Do[
variables = loopVariables[[;; digitCount]];
iterators = allIterators[[;; digitCount - 1]];
Do[ssd +=
SparseArray[
Total[variables^2] ->
maxCombinations/
Times @@ (Tally[PadRight[variables, numberOfDigits]][[All,
2]]!), {maxSum}], {i, 9}, Evaluate[Sequence @@ iterators]],
{digitCount, 2, numberOfDigits}];
onesCount =
Total[Cases[
ArrayRules[ssd] /.
HoldPattern[{a_} -> b_] :> {a,
b}, {_?(MemberQ[iteratesToOne, #] &), _}][[All, 2]]];
(10^numberOfDigits - 1) - onesCount