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]
]