Rebol3 Code Examplex
Digital root
Repeatedly sum digits until a single-digit result remains.
Rebol [
title: "Rosetta code: Digital root"
file: %Digital_root.r3
url: https://rosettacode.org/wiki/Digital_root
needs: 3.0.0
]
droot: function [
"Calculate the digital root and additive persistence of a number"
num [integer!]
return: [block!] "[persistence root]"
] [
persistence: 0
;; Keep summing digits until we get a single digit
until [
;; Convert number to string for digit processing
str: form num
num: 0
;; Iterate through each character in the string
;; Convert each digit character to its numeric value and sum
forall str [ num: num + (str/1 - #"0") ]
;; Count how many iterations we've done
++ persistence
;; Stop when we reach a single digit (< 10)
num < 10
]
;; Return both the persistence count and the final digital root
reduce [persistence num]
]
;; Test the function with several numbers
foreach i [627615 39390 588225 393900588225 55] [
a: droot i
print [pad i -12 "has additive persistence" a/1 "and digital root of" a/2]
]